Python 芹菜将并行任务链接到弦中

Python 芹菜将并行任务链接到弦中,python,python-3.x,redis,celery,celery-task,Python,Python 3.x,Redis,Celery,Celery Task,我正试图了解这个异步任务处理设置。到目前为止,我一直在考虑使用芹菜,但还没有锁定任何东西。唯一的要求是我可以使用Redis作为代理并在多个节点上分发任务 -> Task2 -> Task3 Task1 -> Task2 -> Task3 [then] Task4 -> Task2 -> Task3 说明: Task1生成项目列表 Task2从Task1接收一项作为参数 Task2和Task3是链接

我正试图了解这个异步任务处理设置。到目前为止,我一直在考虑使用芹菜,但还没有锁定任何东西。唯一的要求是我可以使用Redis作为代理并在多个节点上分发任务

       ->  Task2  ->  Task3
Task1  ->  Task2  ->  Task3    [then]    Task4
       ->  Task2  ->  Task3
说明

  • Task1生成项目列表
  • Task2从Task1接收一项作为参数
  • Task2和Task3是链接的,并且每个链都是并行执行的
  • Task4在所有Task2-Task3链完成时执行(不需要从Task3传递任何数据)

问题是,我怎样才能用芹菜做到这一点呢?

这可以用弦函数和链函数来实现,请看一个例子。它应该适合你的需要

from celery import Celery, chord, chain

backend = 'redis://redis:6379/'
app = Celery(result_backend=backend, backend=backend)


@app.task
def task1():
    argument = 123
    return chord([
        chain(task2.s(argument), task3.s()),
        chain(task2.s(argument), task3.s()),
        chain(task2.s(argument), task3.s()),
    ])(task4.s())


@app.task
def task2(argument):
    pass


@app.task
def task3(result_task2):
    pass


@app.task
def task4(result):
    pass


task1.apply_async()