python RabbitMQ队列使用(入门篇)

---恢复内容开始---

python RabbitMQ队列使用

关于python的queue介绍

关于python的队列,内置的有两种,一种是线程queue,另一种是进程queue,但是这两种queue都是只能在同一个进程下的线程间或者父进程与子进程之间进行队列通讯,并不能进行程序与程序之间的信息交换,这时候我们就需要一个中间件,来实现程序之间的通讯。

RabbitMQ

MQ并不是python内置的模块,而是一个需要你额外安装(ubunto可直接apt-get其余请自行百度。)的程序,安装完毕后可通过python中内置的pika模块来调用MQ发送或接收队列请求。接下来我们就看几种python调用MQ的模式(作者自定义中文形象的模式名称)与方法。

RabbitMQ设置远程链接账号密码

启动rabbitmq web服务:2.远程访问rabbitmq:自己增加一个用户,步骤如下:l1.  创建一个admin用户:sudo rabbitmqctl add_user admin 123123l2.  设置该用户为administrator角色:sudo rabbitmqctl set_user_tags admin administratorl3.  设置权限:sudo rabbitmqctl  set_permissions  -p  ‘/‘  admin ‘.‘ ‘.‘ ‘.‘l4.  重启rabbitmq服务:sudo service rabbitmq-server restart之后就能用admin用户远程连接rabbitmq server了。

轮询消费模式

此模式下,发送队列的一方把消息存入mq的指定队列后,若有消费者端联入相应队列,即会获取到消息,并且队列中的消息会被消费掉。

若有多个消费端同时连接着队列,则会已轮询的方式将队列中的消息消费掉。

接下来是代码实例:

producer生产者

# !/usr/bin/env python
import pika
credentials = pika.PlainCredentials(‘admin‘,‘123456‘)
connection = pika.BlockingConnection(pika.ConnectionParameters(
    ‘192.168.56.19‘,5672,‘/‘,credentials))
channel = connection.channel()

# 声明queue
channel.queue_declare(queue=‘balance‘)

# 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=‘balance‘,
                      body=‘Hello World!‘)
print(" [x] Sent ‘Hello World!‘")
connection.close()

发送过队列后,可在MQ服务器中查看队列状态

[[email protected] ~]# rabbitmqctl list_queues
Listing queues ...
hello    1

consumer消费者

# _*_coding:utf-8_*_
__author__ = ‘Alex Li‘
import pika

credentials = pika.PlainCredentials(‘admin‘,‘123456‘)
connection = pika.BlockingConnection(pika.ConnectionParameters(
    ‘192.168.56.19‘,5672,‘/‘,credentials))
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=‘balance‘)

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

channel.basic_consume(callback,
                      queue=‘balance‘,
                      no_ack=True)

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

接收队列后,查看一下队列状态

[[email protected] ~]#  rabbitmqctl list_queues
Listing queues ...
hello    0

队列持久化

当rabbitMQ意外宕机时,可能会有持久化保存队列的需求(队列中的消息不消失)。

producer

# Cheng
# !/usr/bin/env python
import pika

credentials = pika.PlainCredentials(‘admin‘,‘123456‘)
connection = pika.BlockingConnection(pika.ConnectionParameters(
    ‘192.168.56.19‘,5672,‘/‘,credentials))
channel = connection.channel()

# 声明queue
channel.queue_declare(queue=‘durable‘,durable=True)

# 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=‘durable‘,
                      body=‘Hello cheng!‘,
                      properties=pika.BasicProperties(
                          delivery_mode=2,  # make message persistent
                      )
                      )
print(" [x] Sent ‘Hello cheng!‘")
connection.close()

执行后查看队列,记下队列名字与队列中所含消息的数量

[[email protected] ~]# rabbitmqctl list_queues
Listing queues ...
durable    1#重启rabbitmq[[email protected] ~]# systemctl restart rabbitmq-server#重启完毕后再次查看
[[email protected] ~]# rabbitmqctl list_queues
Listing queues ...
durable   #队列以及消息并未消失

执行消费者代码

cunsumer

# Cheng
# _*_coding:utf-8_*_
__author__ = ‘Alex Li‘
import pika

credentials = pika.PlainCredentials(‘admin‘,‘123456‘)
connection = pika.BlockingConnection(pika.ConnectionParameters(
    ‘192.168.56.19‘,5672,‘/‘,credentials))
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=‘durable‘,durable=True)

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    ch.basic_ack(delivery_tag=method.delivery_tag)

channel.basic_consume(callback,
                      queue=‘durable‘,
                      #no_ack=True
                      )

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

可正确接收到信息。

再次查看队列的情况。

[[email protected] ~]# rabbitmqctl list_queues
Listing queues ...
durable    0

广播模式

当producer发送消息到队列后,所有的consumer都会收到消息,需要注意的是,此模式下producer与concerned之间的关系类似与广播电台与收音机,如果广播后收音机没有接受到,那么消息就会丢失。

建议先执行concerned

concerned

# _*_coding:utf-8_*_
__author__ = ‘Alex Li‘
import pika

credentials = pika.PlainCredentials(‘admin‘,‘123456‘)
connection = pika.BlockingConnection(pika.ConnectionParameters(
    ‘192.168.56.19‘,5672,‘/‘,credentials))
channel = connection.channel()

channel.exchange_declare(exchange=‘Clogs‘,
                         type=‘fanout‘)

result = channel.queue_declare(exclusive=True)  # 不指定queue名字,rabbit会随机分配一个名字,exclusive=True会在使用此queue的消费者断开后,自动将queue删除
queue_name = result.method.queue

channel.queue_bind(exchange=‘Clogs‘,
                   queue=queue_name)

print(‘ [*] Waiting for logs. To exit press CTRL+C‘)

def callback(ch, method, properties, body):
    print(" [x] %r" % body)

channel.basic_consume(callback,
                      queue=queue_name,
                      no_ack=True)

channel.start_consuming()

producer

import pika
import sys

credentials = pika.PlainCredentials(‘admin‘,‘123456‘)
connection = pika.BlockingConnection(pika.ConnectionParameters(
    ‘192.168.56.19‘,5672,‘/‘,credentials))
channel = connection.channel()

channel.exchange_declare(exchange=‘Clogs‘,
                         type=‘fanout‘)

message = ‘ ‘.join(sys.argv[1:]) or "info: Hello World!"
channel.basic_publish(exchange=‘Clogs‘,
                      routing_key=‘‘,
                      body=message)
print(" [x] Sent %r" % message)
connection.close()

初级的几种使用rabbitMQ的方式就介绍到这里,下篇博客介绍高级用法。

时间: 2025-01-01 11:45:57

python RabbitMQ队列使用(入门篇)的相关文章

RabbitMq学习一入门篇(hello world)

简介  RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java,也是众多消息队列中表现不俗的一员,作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理这些队列,可极大的提高系统的并发能力. 安装    安装RabbitMq需要erlang,点击下载 去官网下载Rabbit安装包,点击下载 启用web管理界面,启用方式->打开CMD命令,cd到安装目录sbi

python RabbitMQ队列/redis

RabbitMQ队列 安装 http://www.rabbitmq.com/install-standalone-mac.html 安装python rabbitMQ module 1 2 3 4 5 6 7 pip install pika or easy_install pika or 源码   https://pypi.python.org/pypi/pika 实现最简单的队列通信 produce 1 import pika 2 connection = pika.BlockingConn

学习python之路_入门篇A

偶尔经同事的介绍进入了金角大王的博客里,看到大王编写的文章都是关于python编程的,由于自己一直也是做软件测试方面的工作,也一直想往自动化测试方面发展,了解到利用python可以进行自动化测试操作,可以减少人工测试的繁锁操作. 读了python的基础篇了解了python的发展历史及python的基础知识点,就开始跟着课程去编写一些小脚本. 如下面是使用了for循环的语句: 1 for i in range(10): 2 print("*******",i) 3 for j in ra

<七>RabbitMQ队列

---恢复内容开始--- MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.其中较为成熟的MQ产品有IBM WEBSPHERE MQ等等. python Rabb

Python自动化 【第十一篇】:Python进阶-RabbitMQ队列/Memcached/Redis

 本节内容: RabbitMQ队列 Memcached Redis 1.  RabbitMQ 安装 http://www.rabbitmq.com/install-standalone-mac.html 安装python rabbitMQ module pip install pika or easy_install pika or 源码 https://pypi.python.org/pypi/pika 实现最简单的队列 send 端 received 端 1.1 Work Queues 在这

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

python采用pika库使用rabbitmq总结,多篇笔记和示例(转)

add by zhj:作者的几篇文章参考了Rabbitmq的Tutorials中的几篇文章. 原文:http://www.01happy.com/python-pika-rabbitmq-summary/ 这一段时间学习了下rabbitmq,在学习的过程中,发现国内关于python采用pika库使用rabbitmq的资料很少,官网有这方面的资料,不过是都英文的.于是笔者结合自己的理解,就这方面内容写了一些示例,总共有七篇笔记,分享出来. 笔记依次是循序渐进的,笔记内贴出的代码笔者都实际运行过,运

Python入门篇之列表

一.声明 本教程所使用的是Python版本是3.4.2. 二.Python列表介绍 Python列表(List)使用简单而且功能强大,其具有很好的可伸缩性,为开发者编程提供了巨大的便利. [列表变量声明] 列表变量的声明和C语言中声明数组的方式差不多.下图中声明了一个名为 list 的列表变量. [列表元素的索引方式] 笔者在<Python入门篇之字符串使用>一文中介绍过字符串中字符的索引方式.列表元素的索引方式和字符串字符的索引方式是一样的,都是根据元素间隙位置来切割出元素内容.下面做详细说

Python学习(一):入门篇:python中的一些数据结构

Python里的一些基本知识点总结 Last Edit 2014/5/2 这里记录的是Python2.7版本的语法特征,部分与Python3.0是不一样的. 一,关于开发环境 在windows下可以直接在官网下载相关的版本,然后默认安装.使用直带的IDLE编辑器. IDLE中两个有用的快捷键: ALT+P:重复历史命令(从最近到最老) ALT+N:   重复历史命令(从最老到最近) IDLE中没有清屏功能. 在cmd中进行: 1,首先要在环境变量的path中添加相关的路径: C:\Python2