我有一个关于在chunk内重试芹菜任务的问题。我的python版本是2.7.9
,我的芹菜版本是3.1.18
当一个块中的单个任务失败时,它似乎没有被重试,而是整个块一起失败。
首先,有时会失败的任务:
@app.task(bind=True, default_retry_delay=30, max_retries=5)
def sometimes_add(self, x, y):
try:
if random.randint(0, 10) < 8:
return x + y
else:
raise Exception("I'm failing!")
except Exception as e:
raise self.sometimes_add.retry(exc=e)
任务调用100次,分为5个部分,因此有20个任务:
sometimes_add.chunks(zip(range(100), range(100)), 5).apply_async()
我希望块中的失败任务一旦失败就会被重试,但是根本没有任何任务似乎被重试,并且整个5个任务的大部分都作为一个单元失败。
我对Celery来说很新,所以我肯定错过了使用任务分块的最佳方法。如果是这样,我会感激任何反馈。非常感谢!
答案 0 :(得分:0)
您是否设置了后端设置?来自docs:
和弦中使用的任务不得忽略其结果。实际上,这意味着您必须启用CELERY_RESULT_BACKEND才能使用和弦。此外,如果在配置中将CELERY_IGNORE_RESULT设置为True,请确保使用ignore_result = False定义要在和弦中使用的各个任务。这适用于Task子类和装饰任务。
答案 1 :(得分:-1)
这里看起来有语法错误:
sometimes_add.chunks(zip(range(100), range(100)), 5).apply_async()
在添加第三个参数之前你正在关闭zip()
函数 - 我认为它应该是这样的:
sometimes_add.chunks(zip(range(100), range(100), 5)).apply_async()