最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python操作RabbitMQ服務(wù)器實(shí)現(xiàn)消息隊(duì)列的路由功能

 更新時(shí)間:2016年06月29日 18:59:57   作者:陳杰斌  
RabbitMQ是一個(gè)消息隊(duì)列服務(wù)器,這里我們針對(duì)Python+Pika+RabbitMQ的服務(wù)器端環(huán)境,來看一下如何使用Python操作RabbitMQ服務(wù)器實(shí)現(xiàn)消息隊(duì)列的路由功能

Python使用Pika庫(kù)(安裝:sudo pip install pika)可以操作RabbitMQ消息隊(duì)列服務(wù)器(安裝:sudo apt-get install rabbitmq-server),這里我們來看一下MQ相關(guān)的路由功能。

路由鍵的實(shí)現(xiàn)

比如有一個(gè)需要給所有接收端發(fā)送消息的場(chǎng)景,但是如果需要自由定制,有的消息發(fā)給其中一些接收端,有些消息發(fā)送給另外一些接收端,要怎么辦呢?這種情況下就要用到路由鍵了。

路由鍵的工作原理:每個(gè)接收端的消息隊(duì)列在綁定交換機(jī)的時(shí)候,可以設(shè)定相應(yīng)的路由鍵。發(fā)送端通過交換機(jī)發(fā)送信息時(shí),可以指明路由鍵 ,交換機(jī)會(huì)根據(jù)路由鍵把消息發(fā)送到相應(yīng)的消息隊(duì)列,這樣接收端就能接收到消息了。

這邊繼上一篇,還是用send.py和receive.py來模擬實(shí)現(xiàn)路由鍵的功能。send.py表示發(fā)送端,receive.py表示接收端。實(shí)例的功能就是將info、warning、error三種級(jí)別的信息發(fā)送到不同的接收端。

send.py代碼分析

#!/usr/bin/env python
#coding=utf8
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定義交換機(jī),設(shè)置類型為direct
channel.exchange_declare(exchange='messages', type='direct')
 
#定義三個(gè)路由鍵
routings = ['info', 'warning', 'error']
 
#將消息依次發(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()

receive.py代碼分析

#!/usr/bin/env python
#coding=utf8
import pika, sys
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定義交換機(jī),設(shè)置類型為direct
channel.exchange_declare(exchange='messages', type='direct')
 
#從命令行獲取路由鍵參數(shù),如果沒有,則設(shè)置為info
routings = sys.argv[1:]
if not routings:
  routings = ['info']
 
#生成臨時(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()

打開兩個(gè)終端,一個(gè)運(yùn)行代碼python receive.py info warning,表示只接收info和warning的消息。另外一個(gè)終端運(yùn)行send.py,可以觀察到接收終端只接收到了info和warning的消息。如果打開多個(gè)終端運(yùn)行receive.py,并傳入不同的路由鍵參數(shù),可以看到更明顯的效果。

當(dāng)接收端正在運(yùn)行時(shí),可以使用rabbitmqctl list_bindings來查看綁定情況。

路由鍵模糊匹配
路由鍵模糊匹配,就是可以使用正則表達(dá)式,和常用的正則表示式不同,這里的話“#”表示所有、全部的意思;“*”只匹配到一個(gè)詞??赐晔纠湍苊靼琢恕?/p>

這邊繼上面的例子,還是用send.py和receive.py來實(shí)現(xiàn)路由鍵模糊匹配的功能。send.py表示發(fā)送端,receive.py表示接收端。實(shí)例的功能大概是這樣:比如你有個(gè)知心好朋友,不管開心、傷心、工作上的還是生活上的事情都可以和她說;還有一些朋友可以分享開心的事情;還有一些朋友,你可以把不開心的事情和她說。

send.py代碼分析

因?yàn)橐M(jìn)行路由鍵模糊匹配,所以交換機(jī)的類型要設(shè)置為topic,設(shè)置為topic,就可以使用#,*的匹配符號(hào)了。

#!/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)錯(cuò)退出。

#!/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)錯(cuò)退出
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()

打開四個(gè)終端,一個(gè)運(yùn)行如下,表示任何事情都可以和她說:

python receive.py "#"

另外一個(gè)終端 運(yùn)行如下,表示可以和她分享開心的事:

python receive.py "happy.*"

第三個(gè)運(yùn)行如下,表示工作上的事情可以和她分享:

python receive.py "*.work"

最后一個(gè)運(yùn)行python send.py。結(jié)果不難想象出來,就不貼出來了。

相關(guān)文章

  • Python 相對(duì)路徑報(bào)錯(cuò):"No such file or directory"'原因及解決方法

    Python 相對(duì)路徑報(bào)錯(cuò):"No such file or 

    如果你取相對(duì)路徑不是在主文件里,可能就會(huì)有相對(duì)路徑問題:"No such file or directory",由于python 的相對(duì)路徑,相對(duì)的都是主文件所以會(huì)出現(xiàn)Python 相對(duì)路徑報(bào)錯(cuò),今天小編給大家?guī)砹送昝澜鉀Q方案,感興趣的朋友一起看看吧
    2023-02-02
  • 簡(jiǎn)單了解python shutil模塊原理及使用方法

    簡(jiǎn)單了解python shutil模塊原理及使用方法

    這篇文章主要介紹了簡(jiǎn)單了解python shutil模塊原理及使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python的json包位置及用法總結(jié)

    python的json包位置及用法總結(jié)

    在本篇內(nèi)容里小編給大家分享了關(guān)于python的json包用法詳解內(nèi)容,需要的朋友們跟著學(xué)習(xí)下吧。
    2020-06-06
  • python3解析庫(kù)BeautifulSoup4的安裝配置與基本用法

    python3解析庫(kù)BeautifulSoup4的安裝配置與基本用法

    簡(jiǎn)單來說,BeautifulSoup就是Python的一個(gè)HTML或XML的解析庫(kù),我們可以用它來方便地從網(wǎng)頁(yè)中提取數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python3解析庫(kù)BeautifulSoup4的安裝配置與基本用法的相關(guān)資料,需要的朋友可以參考下
    2018-06-06
  • Python使用MapReduce編程模型統(tǒng)計(jì)銷量

    Python使用MapReduce編程模型統(tǒng)計(jì)銷量

    MapReduce是面向大數(shù)據(jù)并行處理的計(jì)算模型、框架和平臺(tái),是一種計(jì)算引擎,可以把我們對(duì)大批量數(shù)據(jù)的計(jì)算通過抽象成map與reduce兩個(gè)子任務(wù)進(jìn)行計(jì)算從而更快的得到想要的結(jié)果
    2022-04-04
  • Python 繪圖庫(kù) Matplotlib 入門教程

    Python 繪圖庫(kù) Matplotlib 入門教程

    Matplotlib是一個(gè)Python語言的2D繪圖庫(kù),它支持各種平臺(tái),并且功能強(qiáng)大,能夠輕易繪制出各種專業(yè)的圖像。本文是對(duì)Python 繪圖庫(kù) Matplotlib 入門教程,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-04-04
  • Python實(shí)現(xiàn)郵件發(fā)送功能的示例詳解

    Python實(shí)現(xiàn)郵件發(fā)送功能的示例詳解

    Python對(duì)SMTP支持有smtplib和email兩個(gè)模塊,email負(fù)責(zé)構(gòu)造郵件,smtplib負(fù)責(zé)發(fā)送郵件。本文將以qq郵箱為例,實(shí)現(xiàn)自己給自己發(fā)送郵件的功能,感興趣的可以了解一下
    2022-11-11
  • 如何使用Python異步之上下文管理器

    如何使用Python異步之上下文管理器

    這篇文章主要為大家介紹了如何使用Python異步之上下文管理器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 介紹Python中的一些高級(jí)編程技巧

    介紹Python中的一些高級(jí)編程技巧

    這篇文章主要介紹了介紹Python中的一些高級(jí)編程技巧,包括推導(dǎo)師和裝飾器等重要的進(jìn)階知識(shí)點(diǎn),皆為深入學(xué)習(xí)Python開發(fā)的必備基本功,需要的朋友可以參考下
    2015-04-04
  • 關(guān)于安裝halcon包pycharm提示不全的問題

    關(guān)于安裝halcon包pycharm提示不全的問題

    很多小伙伴給小編反映在pycham上面安裝halcon對(duì)應(yīng)的安裝包之后,導(dǎo)入出現(xiàn)問題,發(fā)現(xiàn)輸入ha.read 沒有自動(dòng)提示 ,只有幾個(gè)變量和方法,怎么解決這個(gè)問題呢,下面小編給大家?guī)砹税惭bhalcon包pycharm提示不全的問題,一起看看吧
    2021-06-06

最新評(píng)論

城固县| 灵武市| 荥经县| 高陵县| 德州市| 祁东县| 双江| 广饶县| 宁化县| 西昌市| 武夷山市| 呼伦贝尔市| 台湾省| 成武县| 临潭县| 胶州市| 上杭县| 当涂县| 苏州市| 广昌县| 宜都市| 阜宁县| 正镶白旗| 南陵县| 乌鲁木齐市| 秭归县| 明水县| 金坛市| 德令哈市| 两当县| 同仁县| 北碚区| 徐水县| 平安县| 嘉定区| 兰坪| 甘德县| 招远市| 中西区| 阿拉善右旗| 洞头县|