本文介绍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使用的更多相关文章

  1. RabbitMq 消息队列 在Python端的应用

    https://www.cnblogs.com/Xuuuuuu/p/10895552.html rabbit_server持久化,消费者端手动确认保证消息不会丢失.具体代码如下: 1对1生产者端代码: ...

  2. rabbitmq(中间消息代理)在python中的使用

    在之前的有关线程,进程的博客中,我们介绍了它们各自在同一个程序中的通信方法.但是不同程序,甚至不同编程语言所写的应用软件之间的通信,以前所介绍的线程.进程队列便不再适用了:此种情况便只能使用socke ...

  3. Python并发编程-RabbitMQ消息队列

    RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  4. Python RabbitMQ消息队列

    python内的队列queue 线程 queue:不同线程交互,不能夸进程 进程 queue:只能用于父进程与子进程,或者同一父进程下的多个子进程,进行交互 注:不同的两个独立进程是不能交互的.   ...

  5. Python RabbitMQ消息持久化

    RabbitMQ消息持久化:就是将队列中的消息永久的存放在队列中.   处理方案: # 在实例化时加入durable=True来确认消息的实例化,客户端服务端都要写 channel.queue_dec ...

  6. Python操作rabbitmq消息队列持久化

    消息队列持久化 Python操作rabbit消息队列的持久化,如下: # 创建一个名为balance的队列,对queue进行durable持久化设为True(持久化第一步)channel.queue_ ...

  7. 使用Python学习RabbitMQ消息队列

    rabbitmq基本管理命令: 一步启动Erlang node和Rabbit应用:sudo rabbitmq-server 在后台启动Rabbit node:sudo rabbitmq-server ...

  8. 基于Python语言使用RabbitMQ消息队列(一)

    介绍 RabbitMQ 是一个消息中间人(broker): 它接收并且发送消息. 你可以把它想象成一个邮局: 当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, ...

  9. openresty 学习笔记番外篇:python访问RabbitMQ消息队列

    openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...

随机推荐

  1. [no_code]OCR表格处理——技术规格说明书

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 技术规格说明书 我们在这个课程的目标是 远程协同工作,采用最新技术开发软件 这个作业在哪个具体方面 ...

  2. Noip模拟43 2021.8.18

    T1 地一体 可以树形$dp$,但考场没写出来,只打了没正确性的贪心水了$30$ 然后讲题的时候B哥讲了如何正确的贪心,喜出望外的学习了一下 不难发现 每次士兵都会直接冲到叶子节点 从深的点再返回到另 ...

  3. C语言基础知识总结大全

    1.入门程序 #include <stdio.h> int main() { printf("Hello World!"); return 0; } 2.数据类型 数据 ...

  4. STM32直流电机启动(一)驱动电路的介绍

    驱动电路 典型的H桥驱动电路如下:要使电机旋转只需导通对角线上的两个三极管即可,如导通Q1,Q4,关闭Q2,Q4即可驱动电机正转:若想电机反向转动,即导通三极管Q2,Q3,关闭Q1,Q4.此时电路图可 ...

  5. Python之@property详解及底层实现介绍

    转自:https://blog.csdn.net/weixin_42681866/article/details/83376484 前文 Python内置有三大装饰器:@staticmethod(静态 ...

  6. Ubuntu 16.04 菜单栏 换位置 挪到左边 挪到下边

    Ubuntu菜单栏的位置可以调 到左侧 或者底部 调整到底部 $ gsettings set com.canonical.Unity.Launcher launcher-position Bottom ...

  7. LINUX系统新增及自动挂载硬盘-九五小庞

    Linux系统下,添加新硬盘后,自动挂载的方法   1,列出所有硬盘,找到需要挂载的硬盘,例如/dev/vdb.输入: fdisk -l   2,查看硬盘是不是已经被挂载.一个硬盘不能重复挂载,已经挂 ...

  8. jmeter 数据库压力测试之MySql

    1.首先下载合适的数据库驱动:https://mvnrepository.com/artifact/mysql/mysql-connector-java 2.创建testplan,并添加jar包 3. ...

  9. RF运行之后控制信息日志显示乱码(解决方法)

    RIDE运行自动化测试案例时,控制台信息显示乱码,如下所示: 解决方法:进入到python的安装路径下:D:\python37\Lib\site-packages\robotide\contrib\t ...

  10. Charles抓包 mock数据和rewrite功能

    一.mock数据 mock:在后端返回异常或需要=改前端展示的数据时可以模拟返回的response 1.1 抓到接口后 右击保存response到本地,后缀改成.json打开可以看到是把json保存下 ...