Я хотел бы запустить несколько дочерних процессов параллельно, а затем передать результаты от них другой задаче.Я думаю, что это кажется довольно стандартным сценарием, но у меня возникают проблемы с его правильной работой.Кажется, что все работает нормально, когда я использую один пул рабочих, но не совсем, когда я смешиваю рабочие пулы.
Полностью урезанный и надуманный пример - 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
также ведет себя так же.