欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python操作RabbitMQ服務器實現消息隊列的路由功能

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

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

路由鍵的實現

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

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

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

send.py代碼分析

#!/usr/bin/env python
#coding=utf8
import pika
 
connection = pika.BlockingConnection(pika.ConnectionParameters(
        'localhost'))
channel = connection.channel()
 
#定義交換機,設置類型為direct
channel.exchange_declare(exchange='messages', type='direct')
 
#定義三個路由鍵
routings = ['info', 'warning', 'error']
 
#將消息依次發(fā)送到交換機,并設置路由鍵
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()
 
#定義交換機,設置類型為direct
channel.exchange_declare(exchange='messages', type='direct')
 
#從命令行獲取路由鍵參數,如果沒有,則設置為info
routings = sys.argv[1:]
if not routings:
  routings = ['info']
 
#生成臨時隊列,并綁定到交換機上,設置路由鍵
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 info warning,表示只接收info和warning的消息。另外一個終端運行send.py,可以觀察到接收終端只接收到了info和warning的消息。如果打開多個終端運行receive.py,并傳入不同的路由鍵參數,可以看到更明顯的效果。

當接收端正在運行時,可以使用rabbitmqctl list_bindings來查看綁定情況。

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

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

send.py代碼分析

因為要進行路由鍵模糊匹配,所以交換機的類型要設置為topic,設置為topic,就可以使用#,*的匹配符號了。

#!/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']
 
#將消息依次發(fā)送到交換機,并設定路由鍵
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代碼分析

同樣,交換機的類型要設定為topic就可以了。從命令行接收參數的功能稍微調整了一下,就是沒有參數時報錯退出。

#!/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。結果不難想象出來,就不貼出來了。

相關文章

  • Python列表(list)所有元素的同一操作解析

    Python列表(list)所有元素的同一操作解析

    這篇文章主要介紹了Python列表(list)所有元素的同一操作解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • python協程異步IO中asyncio的使用

    python協程異步IO中asyncio的使用

    這篇文章主要介紹了python異步編程之asyncio的使用,python中異步IO操作是通過asyncio來實現的,為了更加詳細說明asyncio,我們先從協程的最基礎開始講解
    2023-12-12
  • python-httpx的具體使用

    python-httpx的具體使用

    HTTPX是Python3的功能齊全的HTTP客戶端,它提供同步和異步API,本文主要介紹了python-httpx的具體使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python+Matplotlib繪制發(fā)散條形圖的示例代碼

    Python+Matplotlib繪制發(fā)散條形圖的示例代碼

    發(fā)散條形圖(Diverging Bar)是一種用于顯示數據分布的圖表,可以幫助我們比較不同類別或分組的數據的差異和相對性,本文介紹了Matplotlib繪制發(fā)散條形圖的函數源碼,需要的可以參考一下
    2023-06-06
  • Python編程scoketServer實現多線程同步實例代碼

    Python編程scoketServer實現多線程同步實例代碼

    這篇文章主要介紹了Python編程scoketServer實現多線程同步實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • jupyter notebook 中輸出pyecharts圖實例

    jupyter notebook 中輸出pyecharts圖實例

    這篇文章主要介紹了jupyter notebook 中輸出pyecharts圖實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 10款最佳Python開發(fā)工具推薦,每一款都是神器

    10款最佳Python開發(fā)工具推薦,每一款都是神器

    這篇文章主要介紹了10款最佳Python開發(fā)工具推薦,每一款都是神器,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-10-10
  • python從網絡讀取圖片并直接進行處理的方法

    python從網絡讀取圖片并直接進行處理的方法

    這篇文章主要介紹了python從網絡讀取圖片并直接進行處理的方法,涉及cStringIO模塊模擬本地文件的使用技巧,需要的朋友可以參考下
    2015-05-05
  • python優(yōu)化數據預處理方法Pandas pipe詳解

    python優(yōu)化數據預處理方法Pandas pipe詳解

    在本文中,我們將重點討論一個將多個預處理操作組織成單個操作的特定函數:pipe。我將通過示例方式來展示如何使用它,讓我們從數據創(chuàng)建數據幀開始吧
    2021-11-11
  • 10行Python代碼計算汽車數量的實現方法

    10行Python代碼計算汽車數量的實現方法

    這篇文章主要介紹了10行Python代碼計算汽車數量的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10

最新評論