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 秒后重试任务”,它确实这样做了。然后,它重复相同的过程两次,总共重试三次,然后放弃。
从我在文档中读到的内容来看,这似乎是正确的方法。难道我做错了什么?
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调用时所用的参数。
| 归档时间: |
|
| 查看次数: |
1691 次 |
| 最近记录: |