我希望Celery自动重试失败的任务。我希望在装饰器中使用autoretry_for
,而不是显式的raise
。
Stackoverflow为显式raise
情况提供了解决方案。
我的代码旨在生成一个ZeroDivisionError
,并使用参数42和.5重试(以生成84的输出(。示例:http://localhost:5001/divide/1/0应该产生一个需要重试的任务,然后产生84的结果。
@celery.task(name='tasks.divide', max_retries=3, args=(42, .5), autoretry_for=(Exception,))
def divide(x: int, y: int) -> int:
return x / y
该函数产生一个"0"的结果;"除以零";并且状态为"0";失败";。如何修改代码以使用新参数重试?
我正在运行Celery 5.2和Python 3.8。
这是我提出的解决方案。
@celery.task(bind=True, name='tasks.divide', max_retries=3, autoretry_for=(Exception,), default_retry_delay=5)
def divide(self, x: int, y: int) -> int:
# time.sleep(5)
if self.request.retries > 0:
if y == 0:
y = 0.0000000001
print(f"x = {x}")
print(f"y = {y}")
return x / y
有几件事需要注意:
- 我添加了
bind=True
,使任务成为绑定任务。这样就可以访问self
对象 - 可以通过检查
self.request.retries > 0
来检查任务是否正在重试 - 如果正在重试该任务,则我会更新参数。在这种情况下,我将
y = 0
更改为y = 0000000001
- decorator中的
args
对解决方案没有贡献,也不允许我保留以前的x
值
我知道还有另一种方法,但我还没有完成对它的研究。Name,从Task派生的自定义类的使用,它实现了on_failure
。故障
https://docs.celeryq.dev/en/stable/userguide/tasks.html