芹菜版本号: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
时使用的参数。