参数已更改的Celery autoetry_for



我希望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

相关内容

  • 没有找到相关文章

最新更新