让芹菜在所有任务中分散开来

时间:2013-07-07 12:36:37

标签: celery django-celery

我有多个任务我想设置为在parallell中执行。

  • 更新软件包:返回软件包列表。
  • 更新版本:获取包并返回版本列表。
  • 更新版本:获取版本(针对包)并提取版本。

这让我感觉像是:

@task()
def update_packages():
    return [1, 2, 3]

@task()
def update_versions(package):
    # Get versions
    return [1, 2, 3]

@task()
def update_releases(version):
    # Get releases

我能做的是按顺序执行它们并等待结果,但我宁愿推送中间结果,就像在shell上一样:

update_packages | update_versions | update_releases

什么魔法的召唤会实现这个目标?

1 个答案:

答案 0 :(得分:1)

我认为,您正在寻找groupsScatter-Gather模式:

@task()
def update_packages():
    res = group(update_versions.s(i) for i in [1, 2, 3])() # run tasks in parallel (Scatter)
    res.get() # wait for all results (Gather)
    return res

@task()
def update_versions(package):
    # Get versions
    res = group(update_packages.s(i) for i in [1, 2, 3])() # run tasks in parallel (Scatter)
    res.get() # wait for all results (Gather)
    return res

@task()
def update_releases(version):
    # Get releases
    return <what you want to see in final>

现在您可以简单地运行update_packages并等待所有结果:

res = update_packages()

您不需要使用.delay,因为update_packages本身不做任何工作。