Подтвердить что ты не робот

Как рабочий из сельдерея, потребляющий из нескольких очередей, решает, с какого потребления сначала?

Я использую Celery для выполнения асинхронных фоновых задач, а Redis - в качестве бэкэнд. Меня интересует поведение работника сельдерея в следующей ситуации:

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

celeryd -E -Q queue1,queue2

Как рабочий решает, где взять следующую задачу, чтобы потреблять? Выполняет ли это случайное использование задачи из queue1 или queue2? Будет ли приоритет выборки из queue1, потому что он первый в списке аргументов, переданных в -Q?

4b9b3361

Ответ 1

Из моего тестирования он обрабатывает несколько очередей кругового стиля.

Если я использую этот тестовый код:

from celery import task
import time


@task
def my_task(item_id):
    time.sleep(0.5)
    print('Processing item "%s"...' % item_id)


def add_items_to_queue(queue_name, items_count):
    for i in xrange(0, items_count):
        my_task.apply_async(('%s-%d' % (queue_name, i),), queue=queue_name)


add_items_to_queue('queue1', 10)
add_items_to_queue('queue2', 10)
add_items_to_queue('queue3', 5)

И запустите очередь с помощью (используя django-сельдерей):

`manage.py celery worker -Q queue1,queue2,queue3`

Он выводит:

Processing item "queue1-0"...
Processing item "queue3-0"...
Processing item "queue2-0"...
Processing item "queue1-1"...
Processing item "queue3-1"...
Processing item "queue2-1"...
Processing item "queue1-2"...
Processing item "queue3-2"...
Processing item "queue2-2"...
Processing item "queue1-3"...
Processing item "queue3-3"...
Processing item "queue2-3"...
Processing item "queue1-4"...
Processing item "queue3-4"...
Processing item "queue2-4"...
Processing item "queue1-5"...
Processing item "queue2-5"...
Processing item "queue1-6"...
Processing item "queue2-6"...
Processing item "queue1-7"...
Processing item "queue2-7"...
Processing item "queue1-8"...
Processing item "queue2-8"...
Processing item "queue1-9"...
Processing item "queue2-9"...

Таким образом, он вытягивает один элемент из каждой очереди, прежде чем перейти к следующему элементу queue1, даже если ВСЕ задачи queue1 были опубликованы перед задачами queue2 и 3.

Примечание.. Как указывал @WarLord, это точное поведение будет работать только тогда, когда CELERYD_PREFETCH_MULTIPLIER установлено в 1. Если оно больше 1, то это означает, что элементы будут извлекаться из очереди в партии. Поэтому, если у вас есть 4 процесса с установленным значением PREFETCH_MULTIPLIER равным 4, это означает, что из очереди будет выведено 16 элементов, поэтому вы не получите точный результат, как указано выше, но он будет по-прежнему примерно соответствовать циклическому.

Ответ 2

Работник, потребляющий несколько очередей, потребляет задание, порядок FIFO поддерживается и в нескольких очередях.

Пример:

Queue1: (t1, t2, t5, t7)
Queue2: (t0, t3, t4, t6)

Предполагая, что 0-7 представляет порядок опубликованных задач

Порядок потребления: t0, t1, t2, t3, t4, t5, t6, t7