2019独角兽企业重金招聘Python工程师标准>>>

上一篇说了路由键的功能,通过设置路由键,可以将消息发送到相应的队列,这里的路由键是要完全匹配,比如info消息的只能发到路由键为info的消息队列。

路由键模糊匹配,就是可以使用正则表达式,和常用的正则表示式不同,这里的话“#”表示所有、全部的意思;“*”只匹配到一个词。看完示例就能明白了。

这边继上一篇,还是用send.py和receive.py来实现路由键模糊匹配的功能。send.py表示发送端,receive.py表示接收端。实例的功能大概是这样:比如你有个知心好朋友,不管开心、伤心、工作上的还是生活上的事情都可以和她说;还有一些朋友可以分享开心的事情;还有一些朋友,你可以把不开心的事情和她说。

send.py代码分析

因为要进行路由键模糊匹配,所以交换机的类型要设置为topic,设置为topic,就可以使用#,*的匹配符号了。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#!/usr/bin/env python

#coding=utf8

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(

               'localhost'))

channel = connection.channel()

#定义交换机,设置类型为topic

channel.exchange_declare(exchange='messages'type='topic')

#定义路由键

routings = ['happy.work''happy.life''sad.work''sad.life']

#将消息依次发送到交换机,并设定路由键

for routing in routings:

    message = '%s message.' % routing

    channel.basic_publish(exchange='messages',

                          routing_key=routing,

                          body=message)

    print message

connection.close()

上例中定义了四种类型的消息,容易理解,就不解释了,然后依次发送出去。

receive.py代码分析

同样,交换机的类型要设定为topic就可以了。从命令行接收参数的功能稍微调整了一下,就是没有参数时报错退出。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

#!/usr/bin/env python

#coding=utf8

import pika, sys

connection = pika.BlockingConnection(pika.ConnectionParameters(

               'localhost'))

channel = connection.channel()

#定义交换机,设置类型为topic

channel.exchange_declare(exchange='messages'type='topic')

#从命令行获取路由参数,如果没有,则报错退出

routings = sys.argv[1:]

if not routings:

    print >> sys.stderr, "Usage: %s [routing_key]..." % (sys.argv[0],)

    exit()

#生成临时队列,并绑定到交换机上,设置路由键

result = channel.queue_declare(exclusive=True)

queue_name = result.method.queue

for routing in routings:

    channel.queue_bind(exchange='messages',

                       queue=queue_name,

                       routing_key=routing)

def callback(ch, method, properties, body):

    print " [x] Received %r" % (body,)

channel.basic_consume(callback, queue=queue_name, no_ack=True)

print ' [*] Waiting for messages. To exit press CTRL+C'

channel.start_consuming()

打开四个终端,一个运行如下,表示任何事情都可以和她说:

python receive.py "#"

另外一个终端 运行如下,表示可以和她分享开心的事:

python receive.py "happy.*"

第三个运行如下,表示工作上的事情可以和她分享:

python receive.py "*.work"

最后一个运行python send.py。结果不难想象出来,就不贴出来了。

参考文章:http://www.rabbitmq.com/tutorials/tutorial-five-python.html

在参考文章的最后面有提到几个难点,笔者自己做了测试,供大家参考:

1、发送信息时,如果不设置路由键,那么路由键设置为”*”的接收端是否能接收到消息?

发送信息时,如果不设置路由键,默认是表示广播出去,理论上所有接收端都可以收到消息,但是笔者试了下,路由键设置为"*"的接收端收不到任何消息。只有发送消息时,设置路由键为一个词,路由键设置为"*"的接收端才能收到消息。在这里,每个词使用"."符号分开的。

2、发送消息时,如果路由键设置为”..”,那么路由键设置为”#.*”的接收端是否能接收到消息?如果发送消息时,路由键设置为一个词呢?

两种情况,笔者都测试过了,可以的。

3、”a.*.#” 和”a.#”的区别

"a.#"只要字符串开头的一个词是a就可以了,比如a、a.haha、a.haha.haha。而这样的词是不行的,如abs、abc、abc.haha。"a.*.#"必须要满足a.*的字符串才可以,比如a.、a.haha、a.haha.haha。而这样的词是不行的,如a。

弄完上面的这些个问题,笔者觉着有些钻牛角尖了,不过既然官方有提出来,就钻一回吧。

转载于:https://my.oschina.net/u/2517356/blog/813716

Python rabbitmq的使用(五)相关推荐

  1. Python学习系列(五)(文件操作及其字典)

    Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件      在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...

  2. python简单代码 春节集五福-新年福利来一波之Python轻松集齐五福(demo)

    新的一年又要到来了,各个大的公司又在这年末为大家送上了新春的祝福,支付宝还是延续了这几年的传统,在年末为大家送上了集五福的活动,为了大家能更快更好的扫出来大大的"福",今天就带领大 ...

  3. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  4. python学习笔记(五)缩进

    python学习笔记(五)缩进 原作:http://www.cnblogs.com/vamei/archive/2012/05/29/2524706.html 笔记: #!/usr/bin/env p ...

  5. python学习中文第五版_前5个学习Python的网站

    python学习中文第五版 Python is a multi-utility high-level language (programming as well as a scripting lang ...

  6. python response重头开始_你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

  7. python连载第十五篇~史上最全列表知识源码+答案

    #2017-12-19 19:34:41 December Tuesday the 51 week, the 353 day #python连载第十五篇~list列表#列表定义,访问,索引,操作,切片 ...

  8. python list方法说明_对python中list的五种查找方法说明

    Python中是有查找功能的,五种方式:in.not in.count.index,find 前两种方法是保留字,后两种方式是列表的方法. 下面以a_list = ['a','b','c','hell ...

  9. 5岁自学python编程-python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹...

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  10. Python 基础课程第五天

    Python 基础课程第五天 第四章:控制语句 循环结构 for循环和可迭代对象遍历 可迭代对象 range 对象 嵌套循环和综合练习 break 语句 continue 语句 else 语句 循环代 ...

最新文章

  1. Python数理统计
  2. RPC和REST区别
  3. python数据分析——如何用python连接远程数据库
  4. python初始化函数_当你学会了Python爬虫,网上的图片素材就开始免费了
  5. vmware vcenter orchestrator configuration提示“用户名密码错误或登录失败超过次数被锁定”...
  6. Git学习(2)Git 安装
  7. Android的JNI【实战教程】4⃣️--C调用Java代码
  8. 【开发环境】Ubuntu 安装 Visual Studio Code 开发环境 ( 下载 Visual Studio Code 安装器 | Ubuntu 安装 deb 包 )
  9. matlab学习笔记 clc和clear
  10. (Rock, Paper, Scissors, Lizard and Spock)sheldon谢耳朵独创的剪刀,布,石头,蜥蜴,史波克 用代码实现
  11. 记一次jstack线程诊断
  12. python search用法,Python-re中search()函数的用法详解(查找ip)
  13. c# chart缩放,局部放大
  14. Learning both Weights and Connections for Efficient Neural Networks
  15. 2021年Java发展怎么样?现在学了Java技术出来是否还能找到工作?
  16. css如何在下拉框添加倒三角,CSS给选中元素增加倒三角形(示例代码)
  17. 卷积神经网络(CNN)相关知识以及数学推导
  18. esp8266-01s控制继电器开关
  19. 织信informat低代码平台怎么样?
  20. 平衡二叉排序树--调整方法快速记忆方法(渣男丢妻弃子法)

热门文章

  1. json 字符串反序列化成DataSet
  2. input输入框汇总
  3. 解决echart中:Cannot read property ‘queryComponents‘ of undefined
  4. MongoDB服务无法注册
  5. Linux用户与用户组
  6. ie11java阻止_企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装
  7. java system.out.read_一个java文件操作小程序 system.out.in buffer read
  8. Date和Calendar
  9. 深入理解java虚拟机 (一) 第二版
  10. 机器学习笔记(十五)——HMM序列问题和维特比算法