Python 优先级队列不适用于芹菜和RabbitMQ

Python 优先级队列不适用于芹菜和RabbitMQ,python,rabbitmq,celery,background-process,Python,Rabbitmq,Celery,Background Process,我正在尝试在我的flask应用程序中使用芹菜3.1.23和RabbitMQ 3.6.11的优先级队列。但是,工人们并不是根据优先级来完成任务的。这是我的密码: 芹菜配置: CELERYD\u预取\u乘数=1 CELERY\u BROKER\u URL=os.environ.get('CELERY\u BROKER\u URL',RABBITMQ\u URL) 芹菜结果后端=os.environ.get('芹菜结果后端',REDIS\u URL) BROKER\u POOL\u LIMIT=int

我正在尝试在我的flask应用程序中使用芹菜3.1.23和RabbitMQ 3.6.11的优先级队列。但是,工人们并不是根据优先级来完成任务的。这是我的密码:

芹菜配置:
CELERYD\u预取\u乘数=1
CELERY\u BROKER\u URL=os.environ.get('CELERY\u BROKER\u URL',RABBITMQ\u URL)
芹菜结果后端=os.environ.get('芹菜结果后端',REDIS\u URL)
BROKER\u POOL\u LIMIT=int(os.environ.get('BROKER\u POOL\u LIMIT',10))
芹菜\默认\队列='非\网络'
芹菜\u忽略\u结果=真
芹菜迟收=正确
芹菜发送事件=错误
芹菜任务结果过期=3600
芹菜\u结果\u持久=假
芹菜任务队列=(
队列('EXTRUMENT',交换('EXTRUMENT',type='direct'),路由_key='EXTRUMENT',队列_参数={'x-max-priority':8}),
队列('web',交换('web',type='direct'),路由_key='web',队列_参数={'x-max-priority':6}),
Queue('non_-web',Exchange('non_-web',type='direct'),routing_-key='non-u-web',Queue_参数={'x-max-priority':4}),
队列('background',交换('background',type='direct'),路由_key='background',队列_参数={'x-max-priority':2}),
)
在这里,我希望在
紧急
队列中排队的任务获得更高的优先级。然后是
web
,然后是
non_-web
,最后是
background
队列。但是在
非web
中排队的任务总是首先执行。这是作业的代码

工作:
从时间导入睡眠
@任务(queue='web',优先级=8)
def高优先级作业():
打印“高优先级作业”
对于范围(1,31)内的i:
打印i
睡眠(1)
@任务(队列='non_-web',优先级=6)
def中等优先级作业():
打印“中等优先级作业”
对于范围(1,31)内的i:
打印i
睡眠(1)
我尝试将作业按如下方式排队:

def queue_jobs():
对于范围(50)内的i:
中等优先级作业。延迟()
对于范围(20)内的i:
高优先级作业。延迟()
在这种情况下,高优先级作业仅在所有中等优先级作业完成后执行。我还尝试从作业声明中删除优先级,并在对作业进行排队时设置优先级,如下所示:

def queue_jobs():
对于范围(50)内的i:
中等优先级作业。应用异步(优先级=6)
对于范围(20)内的i:
高优先级作业。应用异步(优先级=8)

这也没用。我试着把芹菜升级到最新版本。那也没用。这里怎么了?是否需要更改任何设置?

请注意,优先级值按相反顺序排序:根据芹菜官方文档,0为最高优先级。


在您的情况下,
medium\u priority\u job
将首先执行,因为优先级为6,而下一个
high\u priority\u job
将执行正确的操作。

考虑到您在每种情况下使用不同的队列,因此它们会定期执行,这也就不足为奇了。因此,要测试优先级使用情况,请使用单个队列,并向其发送具有不同优先级的任务


此外,当使用不同的代理时,优先级以及它们的含义也存在混淆-。

据我所知,优先级在同一队列中,而不是在不同队列中。因此,设置将是“CELERY\u TASK\u QUEUES=(Queue('urgent',Exchange('urgent',type='direct')、routing\u key='urgent',Queue\u arguments={'x-max-priority':8})”,其中8是最高优先级。您将任务生成具有不同优先级的“紧急”队列,优先级越高越紧急。