Сельдерей цепочки параллельных задач в аккорде - PullRequest
2 голосов
/ 02 апреля 2020

Я пытаюсь обернуть голову вокруг этой установки обработки асинхронных задач. До сих пор я смотрел на использование сельдерея, но пока не привязан ни к чему. Единственное требование - я могу использовать Redis в качестве посредника и распределять задачи по нескольким узлам.

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

Объяснение :

  • Задача 1 создает список элементов
  • Task2 получает один элемент из Task1 в качестве аргумента
  • Task2 и Task3 связаны друг с другом, и каждая из этих цепочек выполняется параллельно
  • Task4 выполняется, когда все Task2-Task3 выполняются цепочки завершены (не нужно передавать какие-либо данные из задачи 3)

Вопрос в том, как я могу это сделать с помощью Celery?

1 Ответ

1 голос
/ 02 апреля 2020

Это можно сделать с помощью функций аккордов и цепочек, пожалуйста, посмотрите на пример. Это должно соответствовать вашим потребностям.

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()
...