gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:41:49 24 4
gpt4 key购买 nike

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)

我预计会在 5 秒后重试,然后在 10 秒后重试,然后在 20 秒后重试,然后在 40 秒后重试,然后在 80 秒后重试。

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

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

最佳答案

retry_backoff选项仅与 autoretries 相关您使用 autoretry_for 任务装饰器参数指定:

A boolean, or a number. If this option is set to True, autoretries will be delayed following the rules of exponential backoff.

就您而言,您自己调用 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函数来进行清理。因此,您并不关心任务是否重试,而是对任务失败的事实使用react,并在 on_failure 回调中相应地处理该事实。如果您的操作应取决于发生的异常,则可以使用调用 cleanup 时使用的参数。

关于python - Celery 忽略 retry_backoff,而是重复重试 180 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62545175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com