我使用的芹菜执行异步后台任务,与Redis的作为后端。 我很感兴趣,在下列情况下芹菜工人的行为:
我使用运行工人为守护celeryd
。 这名工人已经被分配了两个队列,通过消耗-Q
选项:
celeryd -E -Q queue1,queue2
如何工人决定在哪里获取下一个任务,从消费? 它随机消费,无论是从任务queue1
或queue2
? 这将优先从取queue1
,因为它是第一个在传递给参数列表-Q
?
我使用的芹菜执行异步后台任务,与Redis的作为后端。 我很感兴趣,在下列情况下芹菜工人的行为:
我使用运行工人为守护celeryd
。 这名工人已经被分配了两个队列,通过消耗-Q
选项:
celeryd -E -Q queue1,queue2
如何工人决定在哪里获取下一个任务,从消费? 它随机消费,无论是从任务queue1
或queue2
? 这将优先从取queue1
,因为它是第一个在传递给参数列表-Q
?
从我的测试中,它处理多个队列循环赛风格 。
如果我用这个测试代码:
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"...
所以它拉才去到下一个队列1项,即使所有的队列1任务是在队列2&3个任务之前公布每个队列中的一个项目。
注:由于@WarLord指出的那样,当这个具体的行为只会工作CELERYD_PREFETCH_MULTIPLIER
设置为1。如果是大于1,则意味着项目将从分批队列中取出。 所以,如果你有4个进程与PREFETCH_MULTIPLIER设置为4,这意味着将有16个项目从队列中拉出马上蝙蝠,这样你就不会得到如上确切的输出,但它仍然会大致遵循循环。
注意:这个答案已经过时:芹菜的最新版本的作品非常不同又是什么那是在2013 ...
一名工人耗时数个队列消耗的任务,FIFO顺序跨越多个队列维护了。
例:
队列1:(T1,T2,T5,T7)
队列2:(T0,T3,T4,T6)
假设0-7代表的出版任务的顺序
消费的顺序是T0,T1,T2,T3,T4,T5,T6,T7