今天介绍一下生产队列中常用的队列配置,怎么设置队列中任务使得任务之间有个优先级关系,怎么动态指定任务发送的队列。
一、Celery队列配置简介
CELERY_QUEUES = (
Queue("celery", Exchange("celery"), routing_key="celery")
)
celery是设置的队列名 Exchange 是交换机的名称 routing_key 交换机跟队列交流的key 简单讲一下流程就是 celery服务端从rabbitmq中指定的交换机拿到对应的数据,然后发送给有这个交换机的指定的队列。
这个是celery默认的队列设置。
现在我们加多一个队列,设置这个队列具备优先级属性。
# 优先级队列设置
CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1
CELERY_QUEUES = (
Queue("celery", Exchange("celery"), routing_key="celery"),
Queue("celery_demo", Exchange("celery_demo"), routing_key="celery_demo", queue_arguments={'x-max-priority': 9})
)
可以看到队列配置加多了两个属性,以及设置了队列优先级数值queue_arguments最高为9。 注意CELERY_ACKS_LATE,CELERYD_PREFETCH_MULTIPLIER这两个属性一定要加到配置里面,不然优先级属性不会生效。
二、动态指定任务队列,设置优先级
在提交任务的时候apply_async设置队列指定为优先级队列celery_demo,并且设置优先级为5
from celery_test.task_register import *
from celery import group
from celery import chord
sig = add.s(1, 1)
sig.apply_async(queue='celery_demo',priority=5)
三、执行 任务,对比结果
为了更加方便进行对比,我们对注册一个任务,睡眠10s再进行相加
@app.task
def add_time(x, y):
time.sleep(10)
return x + y
1、启动服务端监听任务


2、执行任务
为了方便进行对比优先级有没有生效,我们这里设置了三个任务,分别如下
sig = add_time.s(1, 1)
sig.apply_async(queue='celery')
sig = add_time.s(2, 2)
sig.apply_async(queue='celery')
sig = add_time.s(3, 3)
sig.apply_async(queue='celery')
先看在默认队列的执行结果

sig = add_time.s(1, 1)
sig.apply_async(queue='celery_demo',priority=5)
sig = add_time.s(2, 2)
sig.apply_async(queue='celery_demo',priority=7)
sig = add_time.s(3, 3)
sig.apply_async(queue='celery_demo',priority=8)

可能会有人会问如果提交到优先级队列,但是不设置priority,会默认最高级还是最低级呢? OK,我们看一下结果
sig = add_time.s(1, 1)
sig.apply_async(queue='celery_demo',priority=5)
sig = add_time.s(2, 2)
sig.apply_async(queue='celery_demo')
sig = add_time.s(3, 3)
sig.apply_async(queue='celery_demo',priority=1)

Celery队列的一些基础设置,优先级设置,动态指定队列就先讲到这里,如果有什么问题可以评论告诉我哦。
我是一只前进的蚂蚁,希望能一起前行。
如果对您有一点帮助,您的三连就是我创作的最大的动力,感谢!
下一篇继续讲一下Celery怎么创建并行任务,工作流任务,工作链任务。
注:如果本篇博客有任何错误和建议,欢迎各位指出,不胜感激!!!