Python rabbitmq的使用(五)
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
上一篇說了路由鍵的功能,通過設(shè)置路由鍵,可以將消息發(fā)送到相應(yīng)的隊(duì)列,這里的路由鍵是要完全匹配,比如info消息的只能發(fā)到路由鍵為info的消息隊(duì)列。
路由鍵模糊匹配,就是可以使用正則表達(dá)式,和常用的正則表示式不同,這里的話“#”表示所有、全部的意思;“*”只匹配到一個詞。看完示例就能明白了。
這邊繼上一篇,還是用send.py和receive.py來實(shí)現(xiàn)路由鍵模糊匹配的功能。send.py表示發(fā)送端,receive.py表示接收端。實(shí)例的功能大概是這樣:比如你有個知心好朋友,不管開心、傷心、工作上的還是生活上的事情都可以和她說;還有一些朋友可以分享開心的事情;還有一些朋友,你可以把不開心的事情和她說。
send.py代碼分析
因?yàn)橐M(jìn)行路由鍵模糊匹配,所以交換機(jī)的類型要設(shè)置為topic,設(shè)置為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() ? #定義交換機(jī),設(shè)置類型為topic channel.exchange_declare(exchange='messages',?type='topic') ? #定義路由鍵 routings?= ['happy.work',?'happy.life',?'sad.work',?'sad.life'] ? #將消息依次發(fā)送到交換機(jī),并設(shè)定路由鍵 for routing?in routings: ????message?= '%s message.' % routing ????channel.basic_publish(exchange='messages', ??????????????????????????routing_key=routing, ??????????????????????????body=message) ????print message ? connection.close() |
上例中定義了四種類型的消息,容易理解,就不解釋了,然后依次發(fā)送出去。
receive.py代碼分析
同樣,交換機(jī)的類型要設(shè)定為topic就可以了。從命令行接收參數(shù)的功能稍微調(diào)整了一下,就是沒有參數(shù)時(shí)報(bào)錯退出。
| 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() ? #定義交換機(jī),設(shè)置類型為topic channel.exchange_declare(exchange='messages',?type='topic') ? #從命令行獲取路由參數(shù),如果沒有,則報(bào)錯退出 routings?= sys.argv[1:] if not routings: ????print >> sys.stderr,?"Usage: %s [routing_key]..." % (sys.argv[0],) ????exit() ? #生成臨時(shí)隊(duì)列,并綁定到交換機(jī)上,設(shè)置路由鍵 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() |
打開四個終端,一個運(yùn)行如下,表示任何事情都可以和她說:
python receive.py "#"另外一個終端 運(yùn)行如下,表示可以和她分享開心的事:
python receive.py "happy.*"第三個運(yùn)行如下,表示工作上的事情可以和她分享:
python receive.py "*.work"最后一個運(yùn)行python send.py。結(jié)果不難想象出來,就不貼出來了。
參考文章:http://www.rabbitmq.com/tutorials/tutorial-five-python.html
在參考文章的最后面有提到幾個難點(diǎn),筆者自己做了測試,供大家參考:
1、發(fā)送信息時(shí),如果不設(shè)置路由鍵,那么路由鍵設(shè)置為”*”的接收端是否能接收到消息?
發(fā)送信息時(shí),如果不設(shè)置路由鍵,默認(rèn)是表示廣播出去,理論上所有接收端都可以收到消息,但是筆者試了下,路由鍵設(shè)置為"*"的接收端收不到任何消息。只有發(fā)送消息時(shí),設(shè)置路由鍵為一個詞,路由鍵設(shè)置為"*"的接收端才能收到消息。在這里,每個詞使用"."符號分開的。2、發(fā)送消息時(shí),如果路由鍵設(shè)置為”..”,那么路由鍵設(shè)置為”#.*”的接收端是否能接收到消息?如果發(fā)送消息時(shí),路由鍵設(shè)置為一個詞呢?
兩種情況,筆者都測試過了,可以的。3、”a.*.#” 和”a.#”的區(qū)別
"a.#"只要字符串開頭的一個詞是a就可以了,比如a、a.haha、a.haha.haha。而這樣的詞是不行的,如abs、abc、abc.haha。"a.*.#"必須要滿足a.*的字符串才可以,比如a.、a.haha、a.haha.haha。而這樣的詞是不行的,如a。弄完上面的這些個問題,筆者覺著有些鉆牛角尖了,不過既然官方有提出來,就鉆一回吧。
轉(zhuǎn)載于:https://my.oschina.net/u/2517356/blog/813716
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Python rabbitmq的使用(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【日常填坑】之ajax请求laravel
- 下一篇: python colorama模块