每次重试周期增加celery重试时间

18

我像文档示例一样使用celery进行重试:

@task()
def add(x, y):
    try:
        ...
    except Exception, exc:
        add.retry(exc=exc, countdown=60)  # override the default and
                                          # retry in 1 minute

如何在作业重试时每次增加重试倒计时 - 例如60秒,2分钟,4分钟等,直到达到MaxRetriesExceeded?


1
我认为你应该更改所选答案。 - gdvalderrama
3个回答

35

这里有一种简单的方法可以在每次评估任务时创建更大的延迟。这个值由Celery自己更新,所以你不需要自己管理任何东西。

@task()
def add(x, y):
    try:
        ...
    except Exception as exc:
        raise add.retry(exc=exc, countdown=60 * add.request.retries) 
注意:第一个任务会带着倒计时为0而重复进行,因为第一次运行时重试次数为0。

Note: First task is repeated with countdown of 0. Because number of retries is 0 for the first run.


返回结果为:
注意:第一个任务会带着倒计时为0而重复进行,因为第一次运行时重试次数为0。

2
感谢您提到add.request.retries - Kaveh

10
自从4.2版本开始,您可以使用autoretry_for选项和retry_backoff选项来实现这个目的,例如:
@task(max_retries=10, autoretry_for=(Exception,), retry_backoff=60)
def add(x, y):
    pass

当您调用retry()函数时,似乎无法正常工作(至少在celery 4.2.2上)。 - Sarang

7

将上次重试时间记录在一个变量中,并每次乘以2,直到超过您想要的级别(或者,如果您喜欢某个特定的次数,请保持计数...)


那么除了在每次重试时将重试计数器传递给方法之外,没有更优雅/神奇的方法来解决这个问题吗? - Gregor
我对celery不是很熟悉,但如果你已经阅读了手册并没有找到它,那么这似乎是一种只需要两三行代码就可以轻松实现你想要的功能的简单方法,这似乎很容易。 - Perry
@Gregor,我认为这很优雅,但也许我们可以添加一个retry_step。您可以在http://github.com/ask/issue上创建一个问题来请求此功能。 - asksol
17
顺便说一下,你不需要传递参数,因为重试次数是可用的:interval, step = 60, 60; add.retry(countdown=interval + (step * add.request.retries)。这行代码的意思是设置一个时间间隔interval和步长step,然后使用工作请求的重试次数来计算倒计时,最后将倒计时作为参数传递给add.retry()函数。 - asksol
谢谢asksol,我知道这个计数器一定存在于某个地方,否则celery怎么会在#重试后引发MaxRetriesExceeded异常呢。 - Gregor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接