首页 文章

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

提问于
浏览
9

我想在我的芹菜 Worker 中实施任务优先权 . 我可以通过为高优先级任务和低优先级任务创建不同的队列来实现此目的 . 但是我还需要向所有拥有广播队列且没有工作的工作人员发送广播任务 . 这是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"

当我用这个命令运行芹菜 Worker 时:

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 回答

相关问题