在编写与有速率限制的服务通信且有时会长时间丢失(无响应)的 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/