Как направить цепочку задач в определенную очередь в celery?
когда я маршрутизирую задачу в определенную очередь, она работает:
task.apply_async(queue='beetroot')
но если я создам цепочку:
chain = task | task
а потом пишу
chain.apply_async(queue='beetroot')
он, похоже, игнорирует ключевое слово queue и назначает очередь "сельдерей" по умолчанию.
было бы неплохо, если бы сельдерей поддерживал маршрутизацию в цепочках - все задачи выполнялись последовательно в одной очереди.
3 ответов
Я делаю это так:
subtask = task.s(*myargs, **mykwargs).set(queue=myqueue)
mychain = celery.chain(subtask, subtask2, ...)
mychain.apply_async()
хорошо, я понял это.
вы должны добавить необходимые параметры выполнения, такие как queue= или countdown= в определение подзадачи или через частичное:
подзадача определения:
from celery import subtask
chain = subtask('task', queue = 'beetroot') | subtask('task', queue = 'beetroot')
фрагмент:
chain = task.s().apply_async(queue = 'beetroot') | task.s().apply_async(queue = 'beetroot')
затем вы выполняете цепочку через:
chain.apply_async()
или
chain.delay()
и задачи будут отправлены в очередь "свекла". Дополнительные аргументы выполнения в этой последней команде ничего не сделают. Он было бы неплохо применить все эти аргументы выполнения на уровне цепочки (или группы, или любых других примитивов холста).
это довольно поздно, но я не думаю, что код, предоставленный @mpaf, полностью корректен.
Context: в моем случае у меня есть две подзадачи, из которых первая предоставляет возвращаемое значение, которое передается второму в качестве входного аргумента. У меня были проблемы с выполнением второго задания - я видел в журналах, что сельдерей признает второе задание как обратный вызов первого, но он никогда не выполнит второе.
Это была моя нерабочая цепь код:
from celery import chain
chain(
module.task1.s(arg),
module.task2.s()
).apply_async(countdown=0.1, queue='queuename')
используя синтаксис, предоставленный в ответе @mpaf, я получил обе задачи для выполнения, но порядок выполнения был случайным, а вторая подзадача не была признана обратным вызовом первой. Я получил идею просмотреть документы о том, как явно установить очередь на подзадачу.
это рабочий код:
chain(
module.task1.s(arg).set(queue='queuename'),
module.task2.s().set(queue='queuename')
).apply_async(countdown=0.1)