我有一个芹菜链,可以完成一些任务.每个任务都可能失败并重试.请参阅下面的快速示例:
from celery import task
@task(ignore_result=True)
def add(x, y, fail=True):
try:
if fail:
raise Exception('Ugly exception.')
print '%d + %d = %d' % (x, y, x+y)
except Exception as e:
raise add.retry(args=(x, y, False), exc=e, countdown=10)
@task(ignore_result=True)
def mul(x, y):
print '%d * %d = %d' % (x, y, x*y)
Run Code Online (Sandbox Code Playgroud)
和链:
from celery.canvas import chain
chain(add.si(1, 2), mul.si(3, 4)).apply_async()
Run Code Online (Sandbox Code Playgroud)
运行这两个任务(并假设没有任何失败),你会得到/看到打印:
1 + 2 = 3
3 * 4 = 12
Run Code Online (Sandbox Code Playgroud)
但是,当添加任务第一次失败并在后续重试调用中成功时,链中的其余任务不会运行,即添加任务失败,链中的所有其他任务都不会运行,几秒钟后,添加任务再次运行并成功,链中的其余任务(在本例中为mul.si(3,4))不会运行.
芹菜是否提供了从失败的任务继续失败链的方法?如果没有,那么实现这一目标的最佳方法是什么,并确保链的任务以指定的顺序运行,并且只有在前一个任务成功执行后,即使任务被重试几次?
注1:问题可以解决
add.delay(1, 2).get()
mul.delay(3, 4).get()
Run Code Online (Sandbox Code Playgroud)
但我有兴趣了解为什么链不能用于失败的任务.