我要做的是执行一组任务,并将组中每个任务的结果发送到另一个任务,然后将所有这些任务的结果发送到一个最终任务。
e.g。
jobgroup = (
group(tasks.task1.s(p) for p in params) |
tasks.dmap.s(tasks.task2.s())
)
那部分对我来说没问题,但我遇到的问题是,如果我想把所有结果都归结为一个最后的任务,例如。
mychain = chain(jobgroup | tasks.task3.s())
我看到的是task3()被调用,而task2中的任务仍然处于挂起状态,打印出来的状态(以下代码片段是我在task3函数中打印的内容:< / p>
@task()
def task3(input):
for item in input.results:
logger.info(item.status)
记录结果
[2014-09-04 10:48:41,905: INFO/Worker-7] tasks.task3[27053688-3c5c-4ca5-975f-356a66d55364]: PENDING
[2014-09-04 10:48:41,905: INFO/Worker-7] tasks.task3[27053688-3c5c-4ca5-975f-356a66d55364]: PENDING
那么如何设置它以便在作业组中的所有任务完成之前不会调用task3?
答案 0 :(得分:1)
<强> Chord 强>
A chord consists of a header and a body. The header is a group of tasks that MUST COMPLETE before the callback is called. A chord is essentially a callback for a group of tasks.
示例:强>
>>> from celery import chord
>>> res = chord([add.s(2, 2), add.s(4, 4)])(sum_task.s())
您可以使用chord
完成任务。
from celery import chord, group, chain
task_1 = group(tasks.task1.s(p) for p in params)
task_2 = group(tasks.dmap.s(tasks.task2.s())
task_3 = tasks.task3.s()
workflow = chord(chain([task_1, task_2]))(task_3)