python中的rabbitmq
介绍
RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
RabbitMQ是一个消息代理:它接受和转发消息。你可以把它想象成一个邮局:当你把你想要发布的邮件放在邮箱中时,你可以确定邮差先生最终将邮件发送给你的收件人。在这个比喻中,RabbitMQ是邮政信箱,邮局和邮递员。
RabbitMQ和邮局的主要区别在于它不处理纸张,而是接受,存储和转发二进制数据块 -- 消息。
请注意,生产者,消费者和消息代理不必驻留在同一主机上; 实际上在大多数应用程序中它们不是同一主机上。
Hello World!
(using the Pika Python client)
pip3 install pika
在本教程的这一部分,我们将使用Python编写两个小程序; 发送单个消息的生产者(发送者),以及接收消息并将其打印出来的消费者(接收者)。这是一个消息传递的“Hello World”。
在下图中,“P”是我们的生产者,“C”是我们的消费者。中间的盒子是一个队列 - RabbitMQ代表消费者保存的消息缓冲区。
我们的整体设计将如下所示:
生产者将消息发送到“hello”队列,消费者接收来自该队列的消息。
发送
我们的第一个程序 send.py 会向队列发送一条消息。我们需要做的第一件事是与RabbitMQ服务器建立连接。
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
我们现在连接到本地上的的代理 - 因此是 'localhost'。如果我们想连接到另一台机器上的代理,我们只需在此指定其名称或IP地址。
接下来,在发送之前,我们需要确保收件人队列存在。如果我们发送消息到不存在的位置,RabbitMQ将只删除该消息。我们来创建一个将传递消息的 hello 队列:
channel.queue_declare(queue='hello')
此时我们准备发送消息。我们的第一条消息将只包含一个字符串 "Hello World!"我们想把它发送给我们的 hello 队列。
在RabbitMQ中,消息永远不会直接发送到队列,它总是需要经过交换。我们现在需要知道的是如何使用由空字符串标识的默认交换。这种交换是特殊的 - 它允许我们准确地指定消息应该到达哪个队列。队列名称需要在routing_key参数中指定:
channel.basic_publish(exchange='',routing_key='hello',body='Hello World!')
print(" [x] Sent 'Hello World!'")
在退出程序之前,我们需要确保网络缓冲区被刷新,并且我们的消息被实际传送到RabbitMQ。我们可以通过轻轻关闭连接来完成。
connection.close()
接收
我们的第二个程序 receive.py 将接收队列中的消息并将它们打印在屏幕上。
再次,我们首先需要连接到RabbitMQ服务器。负责连接到Rabbit的代码与以前相同。
下一步,就像以前一样,要确保队列存在。使用queue_declare创建一个队列是幂等的 - 我们可以根据需要多次运行该命令,并且只会创建一个。
channel.queue_declare()
您可能会问为什么我们再次声明队列 - 我们已经在之前的代码中声明了它。如果我们确信队列已经存在,我们可以避免这种情况。例如,如果 send.py 程序之前运行过。但我们还不确定首先运行哪个程序。在这种情况下,重复在两个程序中重复声明队列是一种很好的做法。
列出队列
您可能希望看到RabbitMQ有什么队列以及它们中有多少条消息。您可以使用rabbitmqctl工具(作为特权用户)执行此操作:
> sudo rabbitmqctl list_queues
在Windows上,省略sudo:
> rabbitmqctl.bat list_queues
从队列接收消息更为复杂。它通过向队列订阅 回调函数 来工作。每当我们收到一条消息,这个回调函数就被皮卡库调用。在我们的例子中,这个函数会在屏幕上打印消息的内容。
def callback(ch, method, propertites, body):
print(" [x] Received {}".format(body))
接下来,我们需要告诉RabbitMQ这个特定的回调函数应该从我们的hello队列接收消息:
channel.basic_consume(callable, queue='hello', no_ack=True)
为了让这个命令成功,我们必须确保我们想要订阅的队列存在。幸运的是,我们对此有信心 - 我们已经使用queue_declare创建了一个队列。
NO_ACK参数,后面(几篇之后)会有解释。
最后,我们进入一个永无止境的循环,等待数据并在必要时运行回调。
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
把它放在一起
send.py的完整代码:
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host='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()
receive.py的完整代码:
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
def callback(ch, method, propertites, body):
print(" [x] Received {}".format(body))
channel.basic_consume(callable,queue='hello',no_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
现在我们可以在终端上试用我们的程序。首先,让我们开始一个消费者,它将持续运行等待交付:
python receive.py
# => [*] Waiting for messages. To exit press CTRL+C
# => [x] Received 'Hello World!'
现在开始制作。生产者计划将在每次运行后停止:
python send.py
# => [x] Sent 'Hello World!'
欢呼!我们能够通过RabbitMQ发送我们的第一条消息。正如您可能已经注意到的,receive.py 程序不会退出。它会随时准备接收更多消息,并可能会被Ctrl-C中断。
尝试在新终端中再次运行 send.py。
python中的rabbitmq的更多相关文章
- Python中使用RabbitMQ
一 RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息 ...
- python中使用rabbitmq消息中间件
上周一直在研究zeromq,并且也实现了了zeromq在python和ruby之间的通信,但是如果是一个大型的企业级应用,对消息中间件的要求比较高,比如消息的持久化机制以及系统崩溃恢复等等需求,这个时 ...
- python 学习分享-rabbitmq
一.RabbitMQ 消息队列介绍 RabbitMQ也是消息队列,那RabbitMQ和之前python的Queue有什么区别么? py 消息队列: 线程 queue(同一进程下线程之间进行交互) 进程 ...
- rabbitmq(中间消息代理)在python中的使用
在之前的有关线程,进程的博客中,我们介绍了它们各自在同一个程序中的通信方法.但是不同程序,甚至不同编程语言所写的应用软件之间的通信,以前所介绍的线程.进程队列便不再适用了:此种情况便只能使用socke ...
- 二、消息队列之如何在C#中使用RabbitMQ
1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这 ...
- 关于python中pika模块的问题
工作中经常用到rabbitmq,而用的语言主要是python,所以也就经常会用到python中的pika模块,但是这个模块的使用,也给我带了很多问题,这里整理一下关于这个模块我在使用过程的改变历程已经 ...
- 二、消息队列之如何在C#中使用RabbitMQ(转载)
二.消息队列之如何在C#中使用RabbitMQ 1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源 ...
- python笔记-11 rabbitmq
一.理解rabbitmq的基本背景 1.理解消息队列 1.1 普通queue 在前面的博客中所提到的队列,此处均称之为普通队列 简述一下普通队列的一些分类及不足 1.1.1 基本Queue:queue ...
- 基于Python语言使用RabbitMQ消息队列(一)
介绍 RabbitMQ 是一个消息中间人(broker): 它接收并且发送消息. 你可以把它想象成一个邮局: 当你把想要寄出的信放到邮筒里时, 你可以确定邮递员会把信件送到收信人那里. 在这个比喻中, ...
随机推荐
- 初级游戏外挂编程详解 windows运行原理+游戏辅助编程 游戏外挂编程
详解游戏辅助编程 [目录] 1-什么是Windows API 2-Windows进程 3-Windows 的内存的运行原理 4-windows 中句柄的概念 5-Windows的变量类型 6-辅助实现 ...
- linux下查看某个文件属于哪个包
1.centos/redhat下查看某个文件或命令属于哪个rpm包: $ yum provides /etc/passwd 或者 $ rpm -qf /etc/passwd 2.ubuntu及衍生版: ...
- 稳定sqlplan方法
参考文档:SQLT (SQLTXPLAIN) - Tool that helps to diagnose SQL statements performing poorly [ID 215187.1]
- 迷宫问题——BFS
改进版 BFS #include <bits/stdc++.h> using namespace std; #define coordi(x,y) ( m*(x-1)+y ) const ...
- monodevelop 基础用法
1.mono快捷键 CTRL+K 删除光标所在行的该行后面的代码 CTRL + ALT +C 注释/不注释该行 CTRL+ DOWN 像鼠标滚轮一样向下拖 CTRL + UP 像鼠标滚 ...
- slf4j-log4j12-1.5.8.jar有什么用
slf4j是hibernate的日志接口,通常我们用log4j.jar来实现hibernate的记录日志功能,slf4j-log4j.jar可以看成是用来把slf4j的接口转换成适合log4j的接口的 ...
- ListView实现分页加载(一)制作Demo
一.什么是分页加载 在下面的文章中,我们来讲解LitView分页加载的实现.什么是分页加载呢?我们先看几张效果图吧,如下: ...
- Django admin页面 显示中文问题
http://127.0.0.1:8000/admin/ 该页中实现中文显示. 1. 页面显示的数据表表名 实现中文显示. models.Model类的内部类Meta,有两个特殊的选项:verbos ...
- PHP数组和字符串相互转换以及判断字符串长度
这里只介绍最常用的方法: $array=explode(separator,$string); $string=implode(glue,$array); explode() 函数用来将字符串打散成数 ...
- Redis配置文件(3)常见的配置修改
常见的配置: redis.conf 配置项说明如下: 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以 ...