Celery 忽略 retry_backoff,而是重复重试 180 秒

ale*_*ord 3 python celery django-celery

芹菜版本号:4.4.5

我有一个像这样装饰的函数:

@app.task(bind=True, retry_backoff=5, retry_jitter=False, retry_kwargs={"max_retries": 5})
def foo(self):
    try:
        #work
     except Exception:
         try:
             _log.info(retrying task)
             self.retry()
         except MaxRetriesExceeded:
             _log.error(Permanent failure)
Run Code Online (Sandbox Code Playgroud)

我希望在 5 秒后重试,然后在 10 秒后重试,然后在 20 秒后重试,然后在 40 秒后重试,然后在 80 秒后重试。

相反,celery 会记录“180 秒后重试任务”,它确实这样做了。然后,它重复相同的过程两次,总共重试三次,然后放弃。

从我在文档中读到的内容来看,这似乎是正确的方法。难道我做错了什么?

Tom*_*art 6

retry_backoff选项仅与您使用任务装饰器参数指定的自动重试相关autoretry_for:

布尔值或数字。如果此选项设置为True,则自动重试将按照指数退避规则延迟。

就您而言,您正在给self.retry()自己打电话,因此重试退避不适用。

编辑: 要处理失败后的清理操作,请考虑以下示例:

from celery import Celery
from celery.utils.log import get_task_logger

app = Celery(broker='pyamqp://')

logger = get_task_logger(__name__)

def cleanup(self, exc, task_id, args, kwargs, einfo):
    logger.error('An error has occured, cleaning up...')

@app.task(autoretry_for=(ZeroDivisionError,), retry_kwargs={'max_retries': 3},
          retry_backoff=True, on_failure=cleanup)
def fail():
    return 1/0
Run Code Online (Sandbox Code Playgroud)

当你调用fail任务时,它会失败3次,然后引发ZeroDivisionError异常。此外,它还会调用该cleanup函数来进行清理。因此,您不关心任务是否重试,您会对任务失败的事实做出反应,并在回调中相应地处理该事实on_failure。如果您的操作应取决于发生的异常,则可以使用cleanup调用时所用的参数。