我正在尝试使用celery设置工作流,该工作流创建并行运行的任务组,按特定顺序执行组。使用Celery v3.1.20和redis作为后端。每个组中的某些任务都可以失败,其他步骤并不真正依赖于每个任务都能成功完成工作流程。
这样的事情:
@celery_app.task(name="tasks.chordfinisher")
def chordfinisher(*args, **kwargs):
return "ok"
@celery_app.task(name="tasks.test_task")
def test_task(idx):
t = int(idx[5:])
if not t % 3:
raise ValueError
time.sleep(random.random() * 1.5)
logging.info('[%s] begin' % idx)
def test_chain():
g1 = group(test_task.si("foo::" + str(i)) for i in xrange(10))
g2 = group(test_task.si("bar::" + str(i)) for i in xrange(10))
step1 = chord(g1, chordfinisher.si())
step2 = chord(g2, chordfinisher.si())
# need to wait for all of step1's tasks to COMPLETE
# before starting step2
workflow = (step1 | step2)
workflow()
Its not possible to sync on groups(也是this question)所以这就是为什么我用无意义的回调使它们成为和弦。问题是,当其中一个任务在第一个组中失败时,链中的后续组(上面的step2
)不会执行。有没有办法告诉芹菜继续进行?