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. 客户 ...
随机推荐
- WebGL着色器渲染小游戏实战
项目起因 经过对 GLSL 的了解,以及 shadertoy 上各种项目的洗礼,现在开发简单交互图形应该不是一个怎么困难的问题了.下面开始来对一些已有业务逻辑的项目做GLSL渲染器替换开发. 起因是看 ...
- Spring MVC:HandlerMapping
HandlerMapping 的类图 Spring中存在两种类型的handlers.第一种是 handler mappings(处理程序映射).它们的角色定位与前面所描述的功能完全相同.它们尝试将当前 ...
- hdu 1078 FatMouse and Cheese(记忆搜)
N*N的矩阵,每个格子上有一个值. 老鼠起始在(1,1),每次只能水平着走或垂直着走.且最多只能走K步.且走到的格子里的值必须比上一次呆的格子里的值大. 问老鼠最多收集到多少值. 思路: 记忆搜好写. ...
- Java之父 James Gosling 发表博文 《Too Soon》纪念乔布斯。
几个礼拜前,我们还在讨论乔布斯的辞职.虽然我们都知道这意味着什么,但是我没有想到一切来的如此之快.已经有很多关于这件事情的文章了,特别是"经济学人"的这篇文章. 乔布斯是一个很独特 ...
- Jenkins+SVN+Maven+testNG管理项目
1.登录访问:http://localhost:8080/jenkins 2.系统管理 => 全局工具配置 => ADD JDK AND Add Maven 3.安装SVN插件:系统管 ...
- ssh密码登录
https://stackoverflow.com/a/16928662/8025086 https://askubuntu.com/a/634789/861079 #!/usr/bin/expect ...
- 第三章 sql 的约束
1.0 约束分类 约束类型: 主键 默认值 唯一 外键 非空 关键字: PRIMARY KEY DEFAULT UNIQUE FOREIGN NOT NULL 2.0 建立含约束的表 3.0 主 ...
- tomcat访问的重定向问题
症状: tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080/不能访问,且报404错误.同时其他项目页面也不能访问. 关闭eclipse里面的tomc ...
- 多线程合集(一)---信号量,锁,以及并发编程,自定义任务调度和awaiter
引言 在后端开发中,多线程技术总是后端开发中常用到的技术,那什么是多线程呢,在操作系统中,程序运行的最小单位是进程,那线程则是进程里面的最小单位,关系是一对多的关系,而线程的调度,是由操作系统的时间片 ...
- 生产者消费者模型及Golang简单实现
简介:介绍生产者消费者模型,及go简单实现的demo. 一.生产者消费者模型 生产者消费者模型:某个模块(函数等〉负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.协程 ...