芹菜任务与Twitter沟通

时间:2011-03-17 09:41:29

标签: twitter rabbitmq celery django-celery

在编写与服务进行通信的芹菜任务时有什么正确的方法,这些服务具有速率限制,有时长时间缺失(没有响应)?

我是否必须使用任务重试?如果服务缺少太多时间怎么办?有没有办法存储这些任务以便以后执行很长时间?

如果这是长期任务中的子任务会怎样?

1 个答案:

答案 0 :(得分:2)

首先,我建议您设置套接字超时,以避免长时间等待响应。 你可以捕获套接字TimeOutException,并在这个特殊情况下重试大量的时间,比如15分钟。 无论如何,我通常使用增量百分比的incrementalRetry,这将增加每次任务重试的时间,这在您编写依赖于长时间可用的外部服务的任务时非常有用。 您可以在任务上设置大量重试(如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)
  

如果这是长期任务中的子任务会怎样?

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