Python rabbitmq的使用(一)

在安裝openstack的時候,須要安裝rabbitmq,百度了下rabbitmq,發現是用erlang寫的,基於對erlang的好感,因而就想了解下rabbitmq。html

rabbitmq中文翻譯的話,主要仍是mq字母上:Message Queue,即消息隊列的意思。前面還有個rabbit單詞,就是兔子的意思,和python語言叫python同樣,老外仍是蠻幽默的。rabbitmq服務相似於mysql、apache服務,只是提供的功能不同。rabbimq是用來提供發送消息的服務,能夠用在不一樣的應用程序之間進行通訊。python

安裝rabbitmqmysql

先來安裝下rabbitmq,在ubuntu 12.04下能夠直接經過apt-get安裝:sql

sudo apt-get install rabbitmq-server

安裝好後,rabbitmq服務就已經啓動好了。接下來看下python編寫Hello World!的實例。實例的內容就是從send.py發送「Hello World!」到rabbitmq,receive.py從rabbitmq接收send.py發送的信息。apache

rabbitmq消息發送流程

rabbitmq消息發送流程(來源rabbitmq官網ubuntu

其中P表示produce,生產者的意思,也能夠稱爲發送者,實例中表現爲send.py;C表示consumer,消費者的意思,也能夠稱爲接收者,實例中表現爲receive.py;中間紅色的表示隊列的意思,實例中表現爲hello隊列。服務器

python使用rabbitmq服務,可使用現成的類庫pika、txAMQP或者py-amqplib,這裏選擇了pika。app

安裝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

在筆者的電腦上輸出以下信息:

rabbitmq查看隊列信息

rabbitmq查看隊列信息

確實有一個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這邊會再次接收到信息。

相關文章
相關標籤/搜索