Python Rabbit 广播模式

- fanout: 所有bind到此exchange的queue都可以接收消息
- 订阅发布:fanout 广播消息只能发给以存活的消费端,实时发送,并不能存储数据。

- direct: 通过routingKey和exchange决定的那个唯一的queue可以接收消息
- direct广播 可指定级别接收端进行广播。

- topic:所有符合routingKey(此时可以是一个表达式)的routingKey所bind的queue可以接收消息
- 可同过发出去的多个消息设置 多个级别,消息结尾加入级别。

表达式符号说明:#代表一个或多个字符,*代表任何字符
#.a会匹配a.a,aa.a,aaa.a等
*.a会匹配a.a,b.a,c.a等
注:使用RoutingKey为#,Exchange Type为topic的时候相当于使用fanout
import pika
import sys connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel() # exchange=“自定义名字”
# type = 'fanout' 定义exchange发送类型,广播类型
# exchange_type type报错就使用这个
channel.exchange_declare(exchange='logs',
exchange_type='fanout') # 下面这条命令是 可通过命令行输入定义的消息 or 如果没输入就是后面这段话。
#message = ' '.join(sys.argv[1:]) or "info: Hello World!" # 发送的内容
message = "info: Hello World!" # routing_key 传入queue 由于是广播,不填
channel.basic_publish(exchange='logs',
routing_key='',
body=message)
print(" [x] Sent %r" % message)
connection.close() # 注:由于是广播类型所以不需要写queue。
#_*_coding:utf-8_*_
import pika connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel() channel.exchange_declare(exchange='logs',
exchange_type='fanout')
# exclusive=True 唯一的
# 不指定queue名字,rabbit会随机分配一个名字,
# exclusive=True会在使用此queue的消费者断开后,自动将queue删除
result = channel.queue_declare(exclusive=True) # 随机取queue名字。
queue_name = result.method.queue
print("random queuename",queue_name) # channel.queue_bind 绑定exchange转发器
# exchange=logs 由于rabbitMQ下不知一个exchange需要绑定。
# queue_name 对列名
channel.queue_bind(exchange='logs',
queue=queue_name) print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch, method, properties, body):
print(" [x] %r" % body) channel.basic_consume(callback,
queue=queue_name,
no_ack=True) channel.start_consuming()
RabbitMQ direct广播模式(实例)
import pika
import sys connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel() # exchange=“自定义名字”
# type = 'direct' 定义exchange发送类型,广播类型
# exchange_type type报错就使用这个
channel.exchange_declare(exchange='direct_logs',
exchange_type='direct') # 级别:默认取执行脚本传入参数,如果取不到执行info
severity = sys.argv[1] if len(sys.argv) > 1 else 'info' # 下面这条命令是 可通过命令行输入定义的消息 or 如果没输入就是后面这段话。
message = ' '.join(sys.argv[2:]) or 'Hello World!' # routing_key=severity 消息发送到指定级别
channel.basic_publish(exchange='direct_logs',
routing_key=severity,
body=message)
print(" [x] Sent %r:%r" % (severity, message))
connection.close()
例:python direct_c.py info
import pika
import sys connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel() channel.exchange_declare(exchange='direct_logs',
exchange_type='direct') result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue # 获取执行脚本执行参数
severities = sys.argv[1:] # 如果没有参数就会报错,提示加入参数,并退出程序
if not severities:
sys.stderr.write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
sys.exit(1) print(severities)
# 循环severities这个列表进行绑定
# routing_key=severity 接收端就是severity
for severity in severities:
channel.queue_bind(exchange='direct_logs',
queue=queue_name,
routing_key=severity) print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body)) channel.basic_consume(callback,
queue=queue_name,
no_ack=True) channel.start_consuming()
RabbitMQ topic广播模式
import pika
import sys connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost')) channel = connection.channel() channel.exchange_declare(exchange='topic_logs',
exchange_type='topic') # 级别:默认取执行脚本传入参数,如果取不到执行info
# 发送消息结尾需要加入级别。
routing_key = sys.argv[1] if len(sys.argv) > 1 else 'anonymous.info' # 下面这条命令是 可通过命令行输入定义的消息 or 如果没输入就是后面这段话。
message = ' '.join(sys.argv[2:]) or 'Hello World!' # routing_key=severity 消息发送到指定级别
channel.basic_publish(exchange='topic_logs',
routing_key=routing_key,
body=message)
print(" [x] Sent %r:%r" % (routing_key, message))
connection.close()
import pika
import sys connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost')) channel = connection.channel() channel.exchange_declare(exchange='topic_logs',
exchange_type='topic') result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue # 获取执行脚本执行参数
binding_keys = sys.argv[1:] # 如果没有参数就会报错,提示加入参数,并退出程序
if not binding_keys:
sys.stderr.write("Usage: %s [binding_key]...\n" % sys.argv[0])
sys.exit(1) # 循环severities这个列表进行绑定
for binding_key in binding_keys:
channel.queue_bind(exchange='topic_logs',
queue=queue_name,
routing_key=binding_key) print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch, method, properties, body):
print(" [x] %r:%r" % (method.routing_key, body)) channel.basic_consume(callback,
queue=queue_name,
no_ack=True) channel.start_consuming()
Python Rabbit 广播模式的更多相关文章
- RabbitMQ广播模式
广播模式:1对多,produce发送一则消息多个consumer同时收到.注意:广播是实时的,produce只负责发出去,不会管对端是否收到,若发送的时刻没有对端接收,那消息就没了,因此在广播模式下设 ...
- RabbitMQ基本用法、消息分发模式、消息持久化、广播模式
RabbitMQ基本用法 进程queue用于同一父进程创建的子进程间的通信 而RabbitMQ可以在不同父进程间通信(例如在word和QQ间通信) 示例代码 生产端(发送) import pika c ...
- Exchange-fanout 广播模式
一.前言 我们看到生产者将消息投递到Queue中,实际上这在RabbitMQ中这种事情永远都不会发生.实际的情况是,生产者将消息发送到Exchange(交换器,下图中的X),由Exchange将消息路 ...
- [转]页游开发中的 Python 组件与模式Presentation Transcript
转: 页游开发中的 Python 组件与模式Presentation Transcript 1. 页游开发中的 Python 组件与模式 赖勇浩( http://laiyonghao.com ) 20 ...
- Python的交互模式和命令行模式
Pyhton的交互模式 在终端输入Python3命令就会进入家Python的交互模式,在交互模式下,输入一行代码,回车,就会执行这行代码. Python的命令行模式 在终端输入Python3 1.py ...
- 浅谈Python设计模式 - 外观模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 外观模式 外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口 ...
- demo rabbitmq topic(主题模式),fanout(广播模式),轮询分发,确认接收Ack处理
//durable = true 代表持久化 交换机和队列都要为true ,持久代表服务重启,没有处理的消息依然存在 //topic 根据不同的routkey 发送和接收信息 //fanout 广播模 ...
- Python的组合模式与责任链模式编程示例
Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...
- python实现建造者模式
python实现建造者模式 前言 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这些部件的 ...
随机推荐
- TortoiseGit功能介绍
TortoiseGit功能介绍 使用方便 强大的提交对话框 每个项目设置 最小日志消息长度,以避免意外提交空日志消息 用于拼写检查的语言 与问题跟踪系统集成 有用的工具 有多种语言版本 Tortois ...
- 前端编程tips
1.ts less 网上搜视频教程,不用太复杂的,短短几分钟视频基本就对其入门了,比自己搜官网学习更方便. 常用的ts技术:let name:string=""; let obj ...
- 【CF497E】Subsequences Return 矩阵乘法
[CF497E]Subsequences Return 题意:设$s_k(x)$表示x在k进制下各位数的和mod k的值.给出k,现有序列$s_k(1),s_k(2),...s_k(n)$.求这个序列 ...
- R 544
F2: 什么dfs根本不会啊,只会瞎贪心... 我们考虑先连哪些边,对于u,v两个点,如果u,v所在的联通块都与1相连的话,那我们肯定先不连这种边吧. 因为太亏了啊... 总而言之我们要在不影响答案的 ...
- Fiddler过滤
1.REGEX:\.(js|css|js|png|gif|\?.*|css\?.*)$ 2..css .js .gif .png .jpg .swf
- 解决IE浏览器兼容问题的一行代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- time和datetime和tzinfo
time和datetime模块还有tzinfo (时区)(一直不明白两者的区别,然后摘了两片文章(最后面的两个链接),很清晰...) 一.time模块 常用函数 1. time()函数 time()函 ...
- html5中JavaScript删除全部节点
如果div里有这么些内容: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type ...
- 在Windows上搭建Git Server
Git在版本控制方面,相比与SVN有更多的灵活性,对于开源的项目,我们可以托管到Github上面,非常方便,但是闭源的项目就会收取昂贵的费用. 那么私有项目,如何用Git进行代码版本控制呢?我们可以自 ...
- selenium定位下拉框
下拉选择框(Select) <div> <p>下拉选择框框 Select</p> <select id="proAddItem_kind" ...