twitter - 与 Twitter 通信的 Celery Task

标签 twitter rabbitmq celery django-celery

在编写与有速率限制的服务通信且有时会长时间丢失(无响应)的 celery 任务时,正确的方法是什么?

我必须使用任务重试吗?如果服务错过太多时间怎么办?有没有办法存储此任务以便在很长一段时间后执行?

如果这是一个长任务中的子任务怎么办?

最佳答案

首先,我建议您设置套接字超时以避免长时间等待响应。 您可以捕获套接字 TimeOutException,并在这种特殊情况下重试较长的时间,例如 15 分钟。 无论如何,通常我使用带有增量百分比的增量重试,这会增加每次任务重试的时间,当您编写依赖于长时间可用的外部服务的任务时,这非常有用。 您可以在任务上设置较高的重试次数(例如 50),然后使用 var 设置标准重试时间

#20 seconds
self.default_retry_delay = 20 

在您可以为您的任务实现这样的方法之后

def incrementalRetry(self, exc, perc = 20, args = None):
    """By default the retry delay is increased by 20 percent"""
    if args:
        self.request.args = args

    delay = self.default_retry_delay

    if self.request.kwargs.has_key('retry_deleay'):
        delay = self.request.kwargs['retry_deleay']

    retry_delay = delay+round((delay*perc)/100,2)
    #print "delay"+str(retry_delay)

    self.retry(self.request.args,
               self.request.kwargs.update({'retry_deleay':retry_delay}),
               exc=exc,countdown=retry_delay, max_retries=self.max_retries)

What if this is a subtask in a long task?

如果您不需要结果,您可以使用task.delay(args=[]) 以异步模式启动它 任务组也是一个不错的功能,它允许您启动不同的任务,完成所有任务后,您可以执行工作流程中的其他任务。

关于twitter - 与 Twitter 通信的 Celery Task,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5337301/

相关文章:

java - 如何在java中使用RabbitMQ实现RPC机制

rabbitmq - Windows上的rabbitmq-plugins的"Directory name is invalid."等

ldap - rabbitmq ldap对用户DN不一致的组进行授权

python - 有没有办法使用 Python 的 Celery 在具有特定任务 ID 的特定任务成功或失败时立即收到通知?

python - Celery 使用默认代理而不是 reddis。 Flask + Celery + 工厂模式

python - 带有redis后端的 celery

macos - 使用 MGTwitterEngine 通过 Cocoa 应用程序推特 : HTTP error 401

maven - 使用 Flink 处理 Twitter 数据时的依赖问题

javascript - Android Webview Javascript 将无法工作

cookies - Headless Chrome Puppeteer 使用 Cookie 跳过登录 Twitter?