1. 程式人生 > 實用技巧 >python之RabbitMQ簡單使用

python之RabbitMQ簡單使用

1,簡介

RabbitMQ(Rabbit Message Queue)是流行的開源訊息佇列系統,用erlang語言開發。 1.1關鍵詞說明: Broker:訊息佇列伺服器實體。
Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列。
Queue:訊息佇列載體,每個訊息都會被投入到一個或多個佇列。
Binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
vhost:虛擬主機,一個broker裡可以開設多個vhost,用作不同使用者的許可權分離。
producer:訊息生產者,就是投遞訊息的程式。
consumer:訊息消費者,就是接受訊息的程式。
channel:訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表一個會話任務。 1.2訊息佇列執行機制:
(1)客戶端連線到訊息佇列伺服器,開啟一個channel。
(2)客戶端宣告一個exchange,並設定相關屬性。
(3)客戶端宣告一個queue,並設定相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好繫結關係。
(5)客戶端投遞訊息到exchange。 (6)exchange接收到訊息後,就根據訊息的key和已經設定的binding,將訊息投遞到一個或多個佇列裡。 例如下面的例子中都為首次宣告一個佇列!!! 1.3exchange型別: 1.Direct交換機 特點:依據key進行投遞 例如繫結時設定了routing key為”hello”,那麼客戶端提交的訊息,只有設定了key為”hello”的才會投遞到佇列。 2.Topic交換機 特點:對key模式匹配後進行投遞,符號”#”匹配一個或多個詞,符號”*”匹配一個詞 例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。 3.Fanout交換機 特點:不需要key,採取廣播模式,一個訊息進來時,投遞到與該交換機繫結的所有佇列 2.構建環境
2.1在windows環境下安裝rabbitmq,教程如下: http://jingyan.baidu.com/article/a17d5285173ce68098c8f2e5.html 2.2安裝pika模組 python使用rabbitmq服務,可以使用現成的類庫pika、txAMQP或者py-amqplib,這裡選擇了pika。 在命令列中直接使用pip命令:
pip install pika

3.示例測試

例項的內容就是從send.py傳送訊息到rabbitmq,receive.py從rabbitmq接收send.py傳送的資訊。

P表示produce,生產者的意思,也可以稱為傳送者,例項中表現為send.py;

C表示consumer,消費者的意思,也可以稱為接收者,例項中表現為receive.py;

中間紅色的表示佇列的意思,例項中表現為hello佇列。

#send
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))# 新建連線,rabbitmq安裝在本地則hostname為'localhost'

channel  = connection.channel()#建立通道

# 宣告一個佇列,生產者和消費者都要宣告一個相同的佇列,用來防止萬一某一方掛了,另一方能正常執行
channel.queue_declare(queue='hello')
#n RabbitMQ a message can never be sent directly to the queue, it always needs to go through an exchange.
channel.basic_publish(exchange='',
                      routing_key='hello',# routing_key在使用匿名交換機的時候才需要指定,表示傳送到哪個佇列
                      body = 'Hello World  yes')
print("[x] Send 'Hello World !'")
connection.close()

#receive

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))## 新建連線,rabbitmq安裝在本地則hostname為'localhost'

channel = connection.channel()#建立通道
#You may ask why we declare the queue again ‒ we have already declared it in our previous code.
# We could avoid that if we were sure that the queue already exists. For example if send.py program
#was run before. But we're not yet sure which program to run first. In such cases it's a good
# practice to repeat declaring the queue in both programs.

channel.queue_declare(queue='hello')# 宣告一個佇列,生產者和消費者都要宣告一個相同的佇列,用來防止萬一某一方掛了,另一方能正常執行

def callback(ch,method,properties,body):
    print("[x] Received %r"%body)
channel.basic_consume(queue='hello',#去hello佇列取訊息
                      on_message_callback=callback,#開始接受資料,有資料就呼叫callback 方法處理
                      auto_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()