celery笔记五之消息队列的介绍
本文首发于公众号:Hunter后端
原文链接:celery笔记五之消息队列的介绍
前面我们介绍过 task 的处理方式,将 task 发送到队列 queue,然后 worker 从 queue 中一个个的获取 task 进行处理。
task 的队列 queue 可以是多个,处理 task 的 worker 也可以是多个,worker 可以处理任意 queue 的 task,也可以处理指定 queue 的 task,这个我们在介绍 queue 的时候再做介绍。
这一篇我们来介绍一下存储 task 的队列 queue。
- 默认队列 task_default_queue
- 定义队列
- 将 task 指定到队列 queue 消费
以下的操作都是在 Django 系统的配置中使用。
1、默认队列 task_default_queue
当我们运行一个最简单的延时任务比如 add.delay(1, 2) 时,并没有设置一个消息队列,因为如果我们没有指定,系统会为我们创建一个默认队列。
这个默认的队列被命名为 celery,值在 app.conf.task_default_queue,我们可以查看一下:
from hunter.celery import app
app.conf.task_default_queue
# 输出为 'celery'
2、定义队列
我们可以设想一下这个场景,我们只有一个 worker 处理 task,每个 task 需要处理的时间很长,因为 worker 被占用,这样在我们的任务队列里就会积压很多的 task。
有一些需要即时处理的任务则会被推迟处理,这样的情况下,我们理想的设计是设置多个 worker,多个 worker 分别处理指定队列的 task。
关于 worker 的设置,比如添加多个 worker,给 worker 消费指定队列的 task,我们在 worker 的笔记中再介绍,这里我们介绍一下如何定义队列。
任务队列的定义如下:
# hunter/celery.py
from kombu import Queue
app.conf.task_queues = (
Queue('blog_tasks', ),
)
当我们定义了任务队列之后,我们可以将 task 指定输出到对应的 queue,假设 blog/tasks.py 下有这样一个 task:
# blog/tasks.py
from celery import shared_task
@shared_task
def add(x, y):
return x + y
接下来我们调用这个 task 的时候,需要指定队列:
from blog.tasks import add
add.apply_async((1, 2), queue='blog_tasks')
如果我们就这样配置 celery,这个时候如果我们直接再调用 delay() 函数,也就是不指定 queue 的话,会发现我们发出的 task 是不能被 worker 处理的。
也就是说,下面的操作是不起作用的:
from blog.tasks import add
add.delay(1, 2) # 此时,我们的调用不会被队列接收到
如果需要在调用 task 的时候不指定队列,使用系统默认的队列,这个时候我们需要额外来指定一个 task_default_queue,celery 的配置如下:
# hunter/celery.py
app.conf.task_queues = (
Queue('blog_tasks'),
Queue('default_queue'),
)
app.conf.task_default_queue = 'default_queue'
这样,我们在使用延时任务的时候,就不需要指定 queue 参数了,都会走我们的默认 task 队列:
from blog.tasks import add
add.delay(1, 2) # 队列会被 default_queue 接收到
而如果我们想实现 add 的延时任务走的是 blog_tasks 这个队列,但是我们在调用的时候不想那么麻烦每次都指定 queue 参数,这个就需要用到 task_routes 配置项了。
3、将 task 指定到队列 queue 消费
如果我们想某些函数使用指定的 queue,我们可以使用 task_routes 配置项来操作。
现在我们有两个 application,blog 和 polls,这两个 application 下都有各自的 tasks,文件的内容如下:
# blog/tasks.py
from celery import shared_task
@shared_task
def add(x, y):
return x + y
@shared_task
def minus(x, y):
return x - y
# polls/tasks.py
from celery import shared_task
@shared_task
def multi(x, y):
return x * y
我们想要实现的最终的目的是在调用延时任务的时候,可以直接使用 delay() 的方式,不需要使用 apply_async(queue='xx')。
我们想要实现的功能是,polls/tasks.py 下的所有的延时任务以及 blog/tasks.py 下的 add() 函数进入 queue_1 队列
blog 下的 minus() 函数进入 queue_2 队列
其他所有的 task 都走默认的队列,default_queue。
我们可以如下配置:
app.conf.task_queues = (
Queue('queue_1'),
Queue('queue_2'),
Queue('default_queue'),
)
app.conf.task_routes = {
'polls.tasks.*': {
'queue': 'queue_1',
},
'blog.tasks.add': {
'queue': 'queue_1',
},
'blog.tasks.minus': {
'queue': 'queue_2',
},
}
app.conf.task_default_queue = 'default_queue'
如果想获取更多后端相关文章,可扫码关注阅读:

celery笔记五之消息队列的介绍的更多相关文章
- Rabbit五种消息队列学习(一) – 总述
RabbitMQ支持五种消息传递类型,分别如下图所示: 上图中显示6中消息队列分别为: 1.简单队列 一个生产者将消息放到队列中,一个消费者监听队列 2.工作队列(Work queues) 一个生产者 ...
- Android 开发笔记 “Android 的消息队列模型”
Android是参考Windows的消息循环机制来实现Android自身的消息循环的. Android通过Looper.Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都 ...
- PHP(Mysql/Redis)消息队列的介绍及应用场景案例--转载
郑重提示:本博客转载自好友博客,个人觉得写的很牛逼所以未经同意强行转载,原博客连接 http://www.cnblogs.com/wt645631686/p/8243438.html 欢迎访问 在进行 ...
- PHP(Mysql/Redis)消息队列的介绍及应用场景案例
在进行网站设计的时候,有时候会遇到给用户大量发送短信,或者订单系统有大量的日志需要记录,还有做秒杀设计的时候,服务器无法承受这种瞬间的压力,无法正常处理,咱们怎么才能保证系统正常有效的运行呢?这时候我 ...
- RabbitMQ五种消息队列学习(三)–Work模式
由于在实际应用中,简单队列模型无法解决很多实际问题,而且生产者和消费者是一对一的关系.模型较为单一.故引入Work模式. 结构图 一个生产者.多个消费者. 一个消息只能被一个消费者获取. 测试实现: ...
- Rabbit五种消息队列学习(二) – 简单队列
队列结构图 P:消息的生产者 C:消息的消费者 红色:队列 生产者将消息发送到队列,消费者从队列中获取消息. 测试 1.连接MQ public static Connection getConnect ...
- 物联网微消息队列MQTT介绍-EMQX集群搭建以及与SpringBoot整合
项目全部代码地址:https://github.com/Tom-shushu/work-study.git (mqtt-emqt 项目) 先看我们最后实现的一个效果 1.手机端向主题 topic111 ...
- C#消息队列(RabbitMQ)零基础从入门到实战演练
一.课程介绍 如果您从工作中之听过但未有接触过消息对队列(MQ),如果你接触过一点关于MQ的知识,如果没有这么的多如果的话......,那么阿笨将通过本次<C#消息队列零基础从入门到实战演练&g ...
- 消息队列介绍和SpringBoot2.x整合RockketMQ、ActiveMQ 9节课
1.JMS介绍和使用场景及基础编程模型 简介:讲解什么是小写队列,JMS的基础知识和使用场景 1.什么是JMS: Java消息服务(Java Message Service),Java ...
- 什么是Rabbitmq消息队列? (安装Rabbitmq,通过Rabbitmq实现RPC全面了解,从入门到精通)
目录 Rabbitmq 一: 消息队列介绍 1.介绍 2.MQ解决了什么问题 1.应用的解耦 2.流量削峰 3.消息分发(发布订阅: 观察者模式) 4.异步消息(celery就是对消息队列的封装) 3 ...
随机推荐
- 提供一款局域网聊天小工具,对接了chatGPT3.5
账号.密码随便填,只要自己能记住就可以,网络地址如效果图(本机IP地址+8080端口),效果图如下 服务地址用本机IP,端口可以随便用一个,如8888,填完记得点击按钮开启: 通讯地址如果你有其他人的 ...
- 全网最详细中英文ChatGPT-GPT-4示例文档-智能AI写作从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)
目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...
- SQL优化(一)
1.什么是SQL优化 SQL语句的优化是将性能低下的SQL语句转换成目的相同但是性能优异的SQL语句. 2.为什么需要学习SQL优化 SQL语句是对数据库进行操作的惟一途径,对数据库系统的性能起着决定 ...
- 【Java SE】IO流
1.File类 ①File类的一个对象代表一个文件或一个文件目录 ②File类声明在java.io下 1.1 FIle类的声明 路径分隔符 Windows和DOS系统默认使用'',UNIX和URL使用 ...
- RDIFramework.NET开发框架WinForm版新增编码管理
1.概述 编码管理是企业管理和信息化建设过程中一个至关重要的环节.各信息化系统是通过编码来标识业务对象的,统一的编码方案可以作为各系统的通话语言,也可以为信息化系统的集成提供便利.建设数据编码的基本原 ...
- DRF版本控制(源码分析)
DRF中版本控制的五种情况(源码分析) 在restful规范中要去,后端的API中需要体现版本. drf框架中支持5种版本的设置. 1. URL的GET参数传递(*) 示例: user/?versio ...
- 【能力提升】SQL Server常见问题介绍及快速解决建议
前言 本文旨在帮助SQL Server数据库的使用人员了解常见的问题,及快速解决这些问题.这些问题是数据库的常规管理问题,对于很多对数据库没有深入了解的朋友提供一个大概的常见问题框架. 下面一些问题是 ...
- Shell在日常工作中的应用实践
作者:京东物流 李光新 1 Shell可以帮我们做什么 作为一名测试开发工程师,在与linux服务器交互过程中,大都遇到过以下这些问题: •一次申请多台服务器,多台服务器需要安装相同软件,配置相同的环 ...
- MySQL相关操作(实用函数和sql语法)
1.时间函数 当前时间 select current_timestamp(); 当前时间戳 select UNIX_TIMESTAMP(NOW()); 当前时间戳精确到毫秒 select REPLAC ...
- 小知识:使用errorstack定位特定问题
有客户遇到ORA-2289的报错,同事协助去现场排查,我帮着远程共同check下. 客户只是应用端报出的错误,为了进一步定位,服务端需要开errorstack协助定位具体问题. 下面就以这个ORA-2 ...