ubuntu安裝rabbitmq和python的使用實現
在安裝openstack的時候,需要安裝rabbitmq,百度了下rabbitmq,發現是用erlang寫的,基於對erlang的好感,於是就想了解下rabbitmq。
rabbitmq中文翻譯的話,主要還是mq字母上:Message Queue,即訊息佇列的意思。前面還有個rabbit單詞,就是兔子的意思,和python語言叫python一樣,老外還是蠻幽默的。rabbitmq服務類似於mysql、apache服務,只是提供的功能不一樣。rabbimq是用來提供傳送訊息的服務,可以用在不同的應用程式之間進行通訊。
安裝rabbitmq
先來安裝下rabbitmq,在ubuntu 12.04下可以直接通過apt-get安裝:
sudo apt-get install rabbitmq-server
安裝好後,rabbitmq服務就已經啟動好了。接下來看下python編寫Hello World!的例項。例項的內容就是從send.py傳送“Hello World!”到rabbitmq,receive.py從rabbitmq接收send.py傳送的資訊。
其中P表示produce,生產者的意思,也可以稱為傳送者,例項中表現為send.py;C表示consumer,消費者的意思,也可以稱為接收者,例項中表現為receive.py;中間紅色的表示佇列的意思,例項中表現為hello佇列。
python使用rabbitmq服務,可以使用現成的類庫pika、txAMQP或者py-amqplib,這裡選擇了pika。
安裝pika
安裝pika可以使用pip來進行安裝,pip是python的軟體管理包,如果沒有安裝,可以通過apt-get安裝
sudo apt-get install python-pip
通過pip安裝pika:
sudo pip install pika
send.py程式碼
連線到rabbitmq伺服器,因為是在本地測試,所以就用localhost就可以了。
1 2 3 |
connection
= pika.BlockingConnection(pika.ConnectionParameters(
'localhost' ))
channel =
connection.channel() |
宣告訊息佇列,訊息將在這個佇列中進行傳遞。如果將訊息傳送到不存在的佇列,rabbitmq將會自動清除這些訊息。
1 |
channel.queue_declare(queue = 'hello' )
|
傳送訊息到上面宣告的hello佇列,其中exchange表示交換器,能精確指定訊息應該傳送到哪個佇列,routing_key設定為佇列的名稱,body就是傳送的內容,具體傳送細節暫時先不關注。
1 |
channel.basic_publish(exchange = ' ', routing_key=' hello ',
body=' Hello World!')
|
關閉連線
1 |
connection.close()
|
完整程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/bin/env python
#coding=utf8
import
pika
connection
= pika.BlockingConnection(pika.ConnectionParameters(
'localhost' ))
channel =
connection.channel()
channel.queue_declare(queue = 'hello' )
channel.basic_publish(exchange = ' ', routing_key=' hello ',
body=' Hello World!')
print
" [x] Sent 'Hello World!'"
connection.close()
|
先來執行下這個程式,執行成功的話,rabbitmqctl應該成功增加了hello佇列,並且佇列裡應該有一條資訊,用rabbitmqctl命令來檢視下
rabbitmqctl list_queues
在筆者的電腦上輸出如下資訊:
確實有一個hello佇列,並且佇列裡有一條資訊。接下來用receive.py來獲取佇列裡的資訊。
receive.py程式碼
和send.py的前面兩個步驟一樣,都是要先連線伺服器,然後宣告訊息的佇列,這裡就不再貼同樣程式碼了。
接收訊息更為複雜一些,需要定義一個回撥函式來處理,這邊的回撥函式就是將資訊打印出來。
1 2 |
def
callback(ch, method, properties, body):
print
"Received %r" %
(body,)
|
告訴rabbitmq使用callback來接收資訊
1 |
channel.basic_consume(callback, queue = 'hello' , no_ack = True )
|
開始接收資訊,並進入阻塞狀態,佇列裡有資訊才會呼叫callback進行處理。按ctrl+c退出。
1 |
channel.start_consuming()
|
完整程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/usr/bin/env python
#coding=utf8
import
pika
connection
= pika.BlockingConnection(pika.ConnectionParameters(
'localhost' ))
channel =
connection.channel()
channel.queue_declare(queue = 'hello' )
def
callback(ch, method, properties, body):
print
" [x] Received %r"
% (body,)
channel.basic_consume(callback, queue = 'hello' , no_ack = True )
print
' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()
|
執行程式,就能夠接收到佇列hello裡的訊息Hello World!,然後列印在螢幕上。換一個終端,再次執行send.py,可以看到receive.py這邊會再次接收到資訊。
總結
上面的例項非常簡單了,在官網上還有更多例項和原理說明,筆者也在學習其中的奧妙,歡迎大家來信交流。