RabbitMQ消息中介之Python使用
本文介绍RabbitMQ在python下的基本使用
1. RabbitMQ安装,安装RabbitMQ需要预安装erlang语言,Windows直接下载双击安装即可
RabbitMQ下载地址:http://www.rabbitmq.com/download.html
Erlang语言下载地址:http://www.erlang.org/downloads
2. RabbitMQ的基本使用
发送消息端
# -*- coding:utf-8 -*-
# Author:Wong Du import pika # 生成RabbitMQ连接对象
connection = pika.BlockingConnection(
pika.ConnectionParameters("localhost")
) # 建立连接管道
channel = connection.channel() # 进行队列声明,指定消息要发送到的队列
# durable声明队列持久性,即RabbitMQ重启队列仍旧不丢失(不完全可靠)
# 对现有队列进行durable声明更改无法生效,只有重新声明一个新的队列才生效
channel.queue_declare(queue="hello4", durable=True) # 发送消息到RabbitMQ消息队列里
channel.basic_publish(
exchange='', # 指定交换器
routing_key="hello4", # 要绑定的队列
body="Nice to meet you22223333...", # 要发送的消息
properties=pika.BasicProperties(
delivery_mode=2, # 通过delivery_mode=2将队列内的消息持久化
)
) print("[x] sent 'Nice to meet you22233332...'")
connection.close()
接收消息端
# -*- coding:utf-8 -*-
# Author:Wong Du import pika
import time # 生成RabbitMQ连接对象
connection = pika.BlockingConnection(
pika.ConnectionParameters("localhost")
) # 建立连接管道
channel = connection.channel() # 声明队列名
channel.queue_declare(queue="hello4", durable=True) # 定义构建回调函数
def callback(ch, method, properties, body):
print(ch)
# time.sleep(20)
print("[x] received %r" % body)
# ch.basic_ack(delivery_tag= method.delivery_tag) # 接收端回复消息给rabbixmq,代表该消息处理已完成
# 默认情况下,RabbitMQ循环把消息发送给consumer,
# 通过basic_qos(prefetch_count=1)设置,可以在处理并确认完前一个消息之前,不再接收新信息
# 即实现“能者多劳”的效果
channel.basic_qos(prefetch_count=1)
channel.basic_consume(
callback,
queue="hello4",
no_ack=True, # 如果为True,rabbitmq会在consumer接收到数据时就删除队列中的消息
) print("[*] waiting for messages. To exit press CTRL+C...")
channel.start_consuming()
-----------------------拓展一吓,RabbitMQ消息转发类型:分类筛选,广播,正则匹配------------------------------
3. 分类筛选:RabbitMQ通过消息分类进行对应发送和接收
发送消息端
1 # -*- coding:utf-8 -*-
2 # Author:Wong Du
3
4 import pika
5 import sys
6
7 # 生成RabbitMQ连接对象
8 connection = pika.BlockingConnection(
9 pika.ConnectionParameters('localhost')
10 )
11
12 # 建立连接管道
13 channel = connection.channel()
14
15 # 声明交换器和交换器转发消息类型;'direct'为分类筛选 型
16 channel.exchange_declare(exchange='_direct',
17 exchange_type='direct')
18
19 # 获取脚本命令:根据脚本命令,定义对应严重级别的消息(默认为info类消息)
20 severity = sys.argv[1] if len(sys.argv) > 1 else 'info'
21 # 获取要发送给RabbitMQ的消息(默认为Hello world!)
22 msg = "".join(sys.argv[2:]) or "Hello world!"
23 '''例:python direct分类筛选_producer.py info 无关痛痒的消息
24 表示给RabbitMQ发送一条info级别的消息,消息内容:无关痛痒的消息
25 '''
26
27 channel.basic_publish(exchange='_direct', # 指定交换器
28 routing_key=severity, # 指定要筛选的字段
29 body=msg # 要发送给RabbitMQ的消息
30 )
31
32 print("----exec done----")
33 connection.close()
direct分类筛选_producer
接收消息端
1 # -*- coding:utf-8 -*-
2 # Author:Wong Du
3
4 import pika
5 import sys
6
7 # 生成RabbitMQ连接对象
8 connection = pika.BlockingConnection(
9 pika.ConnectionParameters('localhost')
10 )
11
12 # 建立连接管道
13 channel = connection.channel()
14
15 # 声明交换器和交换器消息转发类型;'direct'为分类筛选 型
16 channel.exchange_declare(exchange='_direct',
17 exchange_type='direct',)
18
19 # 声明随机独家管道,用以接收RabbitMQ的消息
20 Random_Queue = channel.queue_declare(exclusive=True)
21 # 获取管道名
22 queue_name = Random_Queue.method.queue
23
24 # 获取脚本命令;获取相应严重级别的消息,可多个严重级别
25 severities = sys.argv[1:]
26 if not severities:
27 sys.stderr.write("\033[31;1mUsage: %s [info] [warning] [error]\033[0m" % sys.argv)
28 exit()
29
30 for severity in severities:
31 # 将交换器、队列和筛选分类绑定起来
32 # 可以简单理解为:从交换器中通过rongting_key筛选消息后发送给queue
33 channel.queue_bind(exchange='_direct',
34 queue=queue_name,
35 routing_key=severity)
36
37 # 定义消息回调函数
38 def callback(ch, method, properties, body):
39 print(body)
40
41 channel.basic_consume(
42 callback, # 获取消息后交给回调函数进行处理
43 queue=queue_name, # 从指定queue中获取消息
44 no_ack=True # 如果为True,rabbitmq会在consumer接收到数据时就删除队列中的消息
45 )
46
47 print("[*] waiting for messages. To exit press CTRL+C...")
48 # 运行管道,一直接收消息,如无消息则为阻塞状态
49 channel.start_consuming()
direct分类筛选_consumer
4. 广播:RabbitMQ通过广播发送消息给多个consumer,广播模式下发送消息是实时的,没有即时接收,则丢失
发送消息端
1 # -*- coding:utf-8 -*-
2 # Author:Wong Du
3
4 '''
5 RabbitMQ交换器广播模式,
6 当producer发送消息给RabbitMQ时,
7 RabbitMQ会立即转发给所有当前在线的consumer,然后将消息删除
8 如当前没有在线的consumer,消息则会丢失
9 即RabbitMQ下交换器广播模式的消息是实时的,当时发送,当时接收
10 '''
11
12 import pika
13
14 # 生成RabbitMQ连接对象
15 connection = pika.BlockingConnection(
16 pika.ConnectionParameters("localhost")
17 )
18
19 # 建立连接管道
20 channel = connection.channel()
21
22 # 声明交换器及交换器消息转发类型;'fanout'为广播类型
23 channel.exchange_declare(exchange="dudu",
24 # type="fanout",
25 exchange_type="fanout",)
26
27 msg = "Hello world! Nice to meet you..."
28 channel.basic_publish(exchange="dudu", # 指定交换器
29 routing_key='', # routing_key必须配置
30 body=msg) # 要发送给RabbitMQ的消息
31
32 print("---exec done---")
33 connection.close()
fanout广播_producer
接收消息端
1 # -*- coding:utf-8 -*-
2 # Author:Wong Du
3
4 '''
5 RabbitMQ交换器广播模式,
6 当producer发送消息给RabbitMQ时,
7 RabbitMQ会立即转发给所有当前在线的consumer,然后将消息删除
8 如当前没有在线的consumer,消息则会丢失
9 即RabbitMQ下交换器广播模式的消息是实时的,当时发送,当时接收
10 '''
11
12 import pika
13
14 # 生成RabbitMQ连接对象
15 connection = pika.BlockingConnection(
16 pika.ConnectionParameters("localhost")
17 )
18
19 # 建立连接管道
20 channel = connection.channel()
21
22 # 声明交换器和交换器消息转发类型;'fanout'为广播类型
23 channel.exchange_declare(exchange="dudu",
24 exchange_type="fanout",)
25
26 # 声明随机独家队列,用以接收RabbitMQ发来的消息
27 Random_Queue = channel.queue_declare(exclusive=True)
28 # 获取队列名
29 queue_name = Random_Queue.method.queue
30
31 # 将交换器和队列绑定在一起
32 channel.queue_bind(exchange="dudu",
33 queue=queue_name,)
34
35 # 定义消息处理回调函数
36 def callback(ch, method, properties, body):
37 print("[x] received %r" % body)
38
39 channel.basic_consume(
40 callback, # 接收到消息后通过回调函数处理
41 queue=queue_name, # 配置获取消息的队列
42 # no_ack=True, # consumer接收到消息后RabbitMQ即删除掉该消息
43 )
44
45 print("[*] waiting for messages. To exit press CTRL+C...")
46 # 运行管道,一直接收消息,如无消息则为阻塞状态
47 channel.start_consuming()
fanout广播_consumer
5. 正则匹配:RabbitMQ通过关键字标记发送消息,通过匹配关键字接收消息
发送消息端
1 # -*- coding:utf-8 -*-
2 # Author:Wong Du
3
4 '''
5 RabbitMQ交换器的topic正则匹配模式,
6 可理解为direct分类筛选的升级版,
7 既能通过关键字标记消息内容,也能通过正则匹配标记关键字
8 '''
9
10 import pika
11 import sys
12
13 # 生成RabbitMQ连接对象
14 connection = pika.BlockingConnection(
15 pika.ConnectionParameters('localhost')
16 )
17
18 # 建立连接管道
19 channel = connection.channel()
20
21 # 声明交换器和交换器消息转发类型;'topic'为正则匹配类型
22 channel.exchange_declare(exchange='_topic',
23 exchange_type='topic')
24
25 # 获取脚本命令;word用来标记msg,msg为消息内容本身
26 word = sys.argv[1] if len(sys.argv) > 1 else 'any.info'
27 msg = " ".join(sys.argv[2:]) or "Hello world!"
28
29
30 channel.basic_publish(
31 exchange='_topic', # 指定交换器
32 routing_key=word, # 配置标记关键字
33 body=msg # 要发送给RabbitMQ的消息内容
34 )
35
36 print("----exec done----")
37 connection.close()
topic匹配_producer
接收消息端
1 # -*- coding:utf-8 -*-
2 # Author:Wong Du
3
4 '''
5 RabbitMQ交换器的topic正则匹配模式,
6 可理解为direct分类筛选的升级版,
7 既能通过关键字标记消息内容,也能通过正则匹配标记关键字
8 '''
9
10 import pika
11 import sys
12
13 # 生成RabbitMQ连接对象
14 connection = pika.BlockingConnection(
15 pika.ConnectionParameters('localhost')
16 )
17
18 # 建立连接管道
19 chanel = connection.channel()
20
21 # 声明交换器和交换器消息转发类型;'topic'为匹配类型
22 chanel.exchange_declare(exchange='_topic',
23 exchange_type='topic')
24
25 # 声明随机独家队列,用以接收RabbitMQ发来的消息
26 Random_Queue = chanel.queue_declare(exclusive=True)
27 # 获取随机队列队列名
28 queue_name = Random_Queue.method.queue
29
30 # 获取脚本命令;即匹配规则
31 severities = sys.argv[1:]
32 if not severities:
33 print("Usage: %s [*.info] [mysql.*] [#]" % sys.argv)
34 exit(1)
35
36 for severity in severities:
37 # 对交换器、队列、匹配规则进行绑定
38 chanel.queue_bind(exchange='_topic',
39 queue=queue_name,
40 routing_key=severity,)
41
42 # 构建消息处理回调函数
43 def callback(ch, method, properties, body):
44 print(body)
45
46 chanel.basic_consume(
47 callback,
48 queue=queue_name,
49 no_ack=True,
50 )
51
52 print("[*] waiting for messages. To exit press CTRL+C...")
53 # 运行管道,一直接收消息,如无消息则为阻塞状态
54 chanel.start_consuming()
topic匹配_consumer
RabbitMQ消息中介之Python使用的更多相关文章
- RabbitMq 消息队列 在Python端的应用
https://www.cnblogs.com/Xuuuuuu/p/10895552.html rabbit_server持久化,消费者端手动确认保证消息不会丢失.具体代码如下: 1对1生产者端代码: ...
- rabbitmq(中间消息代理)在python中的使用
在之前的有关线程,进程的博客中,我们介绍了它们各自在同一个程序中的通信方法.但是不同程序,甚至不同编程语言所写的应用软件之间的通信,以前所介绍的线程.进程队列便不再适用了:此种情况便只能使用socke ...
- Python并发编程-RabbitMQ消息队列
RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...
- Python RabbitMQ消息队列
python内的队列queue 线程 queue:不同线程交互,不能夸进程 进程 queue:只能用于父进程与子进程,或者同一父进程下的多个子进程,进行交互 注:不同的两个独立进程是不能交互的. ...
- Python RabbitMQ消息持久化
RabbitMQ消息持久化:就是将队列中的消息永久的存放在队列中. 处理方案: # 在实例化时加入durable=True来确认消息的实例化,客户端服务端都要写 channel.queue_dec ...
- Python操作rabbitmq消息队列持久化
消息队列持久化 Python操作rabbit消息队列的持久化,如下: # 创建一个名为balance的队列,对queue进行durable持久化设为True(持久化第一步)channel.queue_ ...
- 使用Python学习RabbitMQ消息队列
rabbitmq基本管理命令: 一步启动Erlang node和Rabbit应用:sudo rabbitmq-server 在后台启动Rabbit node:sudo rabbitmq-server ...
- 基于Python语言使用RabbitMQ消息队列(一)
介绍 RabbitMQ 是一个消息中间人(broker): 它接收并且发送消息. 你可以把它想象成一个邮局: 当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, ...
- openresty 学习笔记番外篇:python访问RabbitMQ消息队列
openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...
随机推荐
- Noip模拟17 2021.7.16
我愿称这场考试为STL专练 T1 世界线 巧妙使用$bitset$当作vis数组使用,内存不会炸,操作还方便,的确是极好的. 但是这个题如果不开一半的$bitset$是会炸内存的,因为他能开得很大,但 ...
- [调试笔记] 晚测5 T1 容易题
众所周知,sbwzx在考试一结束就嚷嚷T1是个sb题.那他为什么调了2小时才调出来呢?快和小编一起看看吧. Sb题:指除了sbwzx别人都能做出来的题 1.CE:震惊!sbwzx竟然连map都不会用, ...
- EFCore_环境搭建与简单使用_01
开发环境搭建 经典步骤:建实体类.建DbContext.生成数据库 本次使用codefirst模式,走下流程,(你也可以先建好数据库,用命令行的形式,直接生成DbContext,而且生成的DbCont ...
- distinct-subsequences leetcode C++
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- 正则表达式之grep
grep 的五个参数,基本的常用的: -a :将 binary 档案以 text 档案的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺 ...
- [linux]centos7.4上升级python2版本到python3.6.5 【安装双版本,默认python3】
版本声明 centos7.4 前言:linux上的python默认是版本2的,之前学django项目用的是3的版本 所以得升级下版本~ 1.下载python3.6.5 cd /usr/local/ w ...
- vue项目部署到docker中
通过nginx镜像部署 vue项目npm run build打包成dist目录,有的打包会加上版本号 启动 docker 将dist目录通过xftp拷贝到linux服务器上,同目录下新建Dockerf ...
- Spring中bean的初始化和销毁几种实现方式
Bean的生命周期 : 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – --- 销毁前操作 – 销毁方法的调用. [1]init-metho ...
- Part 21 to 22 AngularJS anchorscroll
Part 21 AngularJS anchorscroll example $anchorscroll service is used to jump to a specified element ...
- 博主日常工作中使用的shell脚本分享
前言: 今天给大家分享一篇在我工作中常用的一个shell脚本,里面有一些我们常用到的shell操作.该脚本用于本地电脑和服务器交互上,实现以下功能: 自动拉取自己个人电脑上的源码到服务器上yocto包 ...