将芹菜优先级队列与广播任务一起使用

时间:2015-06-01 09:48:18

标签: python rabbitmq celery

我想在我的芹菜工人中实施任务优先权。我可以通过为高优先级任务和低优先级任务创建不同的队列来实现此目的。但是我还需要向所有拥有广播队列且没有工作的工作人员发送广播任务。这是tasks.py文件:

from celery import Celery
from kombu.common import Broadcast, Queue, Exchange

app = Celery('tasks')

app.conf.update(
    CELERY_RESULT_BACKEND='amqp',
    CELERY_ACCEPT_CONTENT=['json'],
    CELERY_TASK_SERIALIZER='json',
    CELERY_RESULT_SERIALIZER='json',
    BROKER_URL='amqp://',
    CELERY_QUEUES=(Queue('default',
                         Exchange('default'),
                         routing_key='default'),
                   Queue('low_priority',
                         Exchange('low_priority'),
                         routing_key='low_priority'),
                   Broadcast('broadcast_tasks'), ),
    CELERY_ROUTES={'tasks.broadcast':
                   {'queue': 'broadcast_tasks'},
                   'tasks.low_task':
                   {'queue': 'low_priority'},
                   },
    CELERY_DEFAULT_QUEUE = 'default',
    CELERY_DEFAULT_EXCHANGE = 'default',
    CELERY_DEFAULT_ROUTING_KEY = 'default'
)

@app.task
def broadcast():
    print "Broadcast called"

@app.task
def low_task():
    print "Low priority called"

@app.task
def def_task():
    print "Default called"

当我使用此命令运行芹菜工人时:

celery -A tasks -Q default worker --loglevel=info
celery -A tasks -Q default,low_priority worker --loglevel=info

任务优先级有效但广播任务未得到确认。

当我在没有队列参数的情况下运行相同的命令时,广播有效,但任务优先级不起作用:

celery -A tasks worker --loglevel=info
celery -A tasks worker --loglevel=info

据我了解,这是因为广播队列具有唯一的名称,例如每个工作人员都有bcast.0b5dbce0-9bcb-48a5-8554-cbb7f32a6703

有没有人有一个好的解决方法?提前谢谢!

1 个答案:

答案 0 :(得分:0)

您必须显式使用广播队列,因此请按照ANDY_VAR的说明,将命令行调用修改为上面的注释。

在这里问了类似的问题: