我有一个芹菜链运行一些任务。每个任务都可能失败并被重试。请参阅下面一个简单的例子:重试芹菜失败的任务是链条的一部分
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)
和链条:
from celery.canvas import chain
chain(add.si(1, 2), mul.si(3, 4)).apply_async()
运行两个任务(并假设没有失败),你会得到/看印刷:
1 + 2 = 3
3 * 4 = 12
但是,当添加任务第一次失败并在后续的重试调用中成功时,链中的其余任务不会运行,即添加任务失败,链中的所有其他任务都不会运行,并且在af几秒后,添加任务再次运行并成功,链中的其余任务(本例中为mul.si(3,4))不会运行。
芹菜是否提供了一种方法来继续从失败的任务中继续失败链?如果不是,那么完成此操作的最佳方法是什么,并确保链的任务按照指定的顺序运行,并且只有在前一个任务成功执行后才会执行,即使任务重试了几次也是如此。
注1:问题可以通过做
add.delay(1, 2).get()
mul.delay(3, 4).get()
来解决,但我想了解为何链不失败的任务。
我决定使用运行,否则将在链中的所有任务的连锁任务,而是等待一个任务开始在另一个之前完成,如:'task1.delay([PARAMS])。得到(); 。task2.delay([PARAMS])得到(); task3.delay([PARAMS])。得到()'。链式任务可以捕获任何任务引发的异常并重试自身。 – Andrei 2012-07-25 09:45:13
因此,从你的例子中,t1e和t2e必须分别调用t2和t3,对吧? – Andrei 2012-07-25 09:51:17
这个例子只是我对可能的链式语法的思考。这意味着每个接下来的任务,现在确实是对的任务,如果在上一步中没有异常发生/错误对中第一个元素将被调用,第二个元素是上一步骤的失败异常/错误处理程序。 't1e'的意思是't1错误处理程序' – anh 2012-07-25 10:01:54