Группа Celery () и chord () не могут собирать результаты из нескольких пулов задач - PullRequest
0 голосов
/ 05 февраля 2019

Я хотел бы запустить несколько дочерних процессов параллельно, а затем передать результаты от них другой задаче.Я думаю, что это кажется довольно стандартным сценарием, но у меня возникают проблемы с его правильной работой.Кажется, что все работает нормально, когда я использую один пул рабочих, но не совсем, когда я смешиваю рабочие пулы.

Полностью урезанный и надуманный пример - 2 файла Python, работающие на разных серверах.

tasks.py

from celery import Celery
from functools import reduce

app = Celery('tasks', backend='redis://redis:6379/0', broker='redis://redis:6379/0')

app.conf.task_routes = {'tasks.*': {'queue': 'tasks'}}


@app.task
def mul(x, y):
    print(f'{x} * {y} = { x * y }')
    return x * y


if __name__ == '__main__':
    app.start()

maths.py

from celery import Celery

app = Celery('maths', backend='redis://redis:6379/0', broker='redis://redis:6379/0')

app.conf.task_routes = {'maths.*': {'queue': 'maths'}}


@app.task
def add(a, b):
    print(f'{a} + {b} = {a + b}')
    return a + b


if __name__ == '__main__':
    app.start()

Я начинаю их с

celery -A tasks worker -E -Q tasks

и

celery -A maths worker -E -Q maths

соответственно

Затем на своем локальном хосте я запускаю следующее:

from tasks import mul
from maths import add
from celery import group

print(mul.delay(2, 3).get())
print(add.delay(2, 3).get())

print(group(mul.s(2, 3), add.s(2, 3))().get())

Первые 2 print операторы отражаются от терминала, нотретий просто зависает и приглашение никогда не возвращается, пока я не отправлю SIGTERM.Просматривая журналы для 2 сервисов, я вижу вывод их операторов печати:

tasks_1             | [2019-02-04 21:03:58,181: WARNING/ForkPoolWorker-2] 2 * 3 = 6
maths_1             | [2019-02-04 21:03:58,188: WARNING/ForkPoolWorker-2] 2 + 3 = 5
tasks_1             | [2019-02-04 21:03:58,200: WARNING/ForkPoolWorker-2] 2 * 3 = 6
maths_1             | [2019-02-04 21:03:58,202: WARNING/ForkPoolWorker-2] 2 + 3 = 5

Итак, ясно, что задачи выполняются, но, думаю, результаты никогда не возвращаются к вызывающей стороне.Есть ли способ настроить сельдерей для обработки этого сценария?Хотя я показал эту проблему только с group, chord также ведет себя так же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...