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这边会再次接收到信息。

相关文章
相关标签/搜索