celery:在所有子任务的所有子任务都运行后调用任务

时间:2015-08-15 08:49:07

标签: python celery

我有两个主要任务: 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 任务创建的数据。

2 个答案:

答案 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