Как направить цепочку задач в определенную очередь в 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)