2011-03-17 92 views
3

编写与服务进行通信的芹菜任务时,正确的方法是什么?这些任务与费率限制有关并且有时在很长一段时间内缺失(无响应)?与Twitter交流的芹菜任务

我必须使用任务重试吗?如果服务缺少太多时间会怎么样?有没有办法将这些任务存储以便在较长时间后执行以后执行?

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

回答

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启动它在异步模式下(参数= []) 一个很好的功能还允许您推出不同的任务,后任务组一切都完成了,你可以在你工作流程中的其他东西。