芹菜会忽略retry_backoff,而是重复重试 180 秒



芹菜版本号: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)

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

相反,芹菜会记录"180 秒后重试任务",它确实如此。然后,它会重复相同的过程两次,总共重试三次,然后放弃。

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

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

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

相关内容

  • 没有找到相关文章

最新更新