对于这样的任务:

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(

如果它引发异常,并且我想从守护程序端重试,如何应用指数退避算法,即在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)

为了防止Thundering Herd Problem,您可以考虑将随机抖动添加到指数补偿中:
import random
self.retry(exc=exc, countdown=int(random.uniform(2, 4) ** self.request.retries))

关于python - 重试 celery 任务并以指数方式退回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9731435/

10-11 07:33