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