重试芹菜任务与指数退出

对于这样的任务:

from celery.decorators import task @task() def add(x, y): if not x or not y: raise Exception("test error") return self.wait_until_server_responds( 

如果它抛出一个exception,我想从守护进程重试它,如何应用指数退避algorithm,即2^2, 2^3,2^4等秒后?

也是从服务器端维护的重试,如果工人碰巧遇害,那么下一个产生的工作人员将采取重试任务?

task.request.retries属性包含到目前为止的尝试次数,所以您可以使用它来实现指数回退:

 from celery.task import task @task(bind=True, max_retries=3) def update_status(self, auth, status): try: Twitter(auth).update_status(status) except Twitter.WhaleFail as exc: self.retry(exc=exc, countdown=2 ** self.request.retries) 

为了防止雷鸣群体问题 ,您可以考虑在指数回退中添加随机抖动:

 import random self.retry(exc=exc, countdown=int(random.uniform(2, 4) ** self.request.retries)) 

从Celery 4.2开始(尚未发布),您可以将您的任务configuration为自动使用指数回退: http : //docs.celeryproject.org/en/master/userguide/tasks.html#automatic-retry-for -known的例外

 @app.task(autoretry_for=(Exception,), retry_backoff=2) def add(x, y): ... 

不要被“4.1版本的新特性”所迷惑。 在文档中公布,它还没有发布,请参阅合并请求