我有两个主要任务: main_A 和 main_B 。
extract_new会产生大量 sub 任务,这些任务本身会产生 subsub1 和 subsub2 任务。
我想在所有 subsubA 和 subsubB 任务运行后运行 main_B 。在此图中,任务取决于上述任务:
main_A
/ \
/ \
/ \
/ \
sub sub
/\ / \
/ \ / \
sub1 sub2 sub1 sub2
\ | / /
\ | / /
\ | / /
\ | / /
main_B
我该怎么做?如果我将 main_B 设置为 main_A 的回调,则会在 main_A 生成 sub 任务后运行juste 。如果我将 sub 任务作为带有 main_B 的和弦作为回调运行, main_B 将在 subsub1 之前运行, subsub2 已经完成。
这两个都不是选项,因为main_B依赖于 sub , subsub1 和 subsub2 任务创建的数据。
答案 0 :(得分:1)
您应该可以使用AsyncResult.collect()
来管理此问题 - 请参阅docs
@app.task
def runner(x, y, z):
result = main_a.apply_async((x, y,z))
result.collect()
main_B.apply_async()
您还需要检查错误等
答案 1 :(得分:1)
如果您需要完全非阻塞行为,那么您可以重构代码,这样您的任务就可以构建一个canvas对象并将其传递回调用链,而不是生成子任务
my_chain = mainA.s((params,...)) | mainA_subtasks.s(params) | main_B(params)
@app.task
def mainA(params):
# in here put the main work done by mainA
def mainA_subtasks(params):
my_group = []
for i in some_loop():
tasks = get_sub_tasks(params, i)
my_group.extend(tasks)
return group(my_group)
# and so on