python操作rabbitmq,实现生产消费者模型
更多详情参考官方文档:https://www.rabbitmq.com/tutorials/tutorial-six-python.html
参考博客:https://blog.csdn.net/weixin_41896508/article/details/80997828
下载第三方模块pika,版本差异语法差别需指定版本
pip3 install -i https://pypi.douban.com/simple pika==0.13.1
(1)简单的生产者和消费者(无确认无持久化)
生产者producer.py代码
import pika
# 创建凭证,使用rabbitmq用户密码登录
credentials = pika.PlainCredentials("yang","")
# 新建连接到服务器ip
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))
# 创建频道
channel = connection.channel()
# 声明一个队列,用于接收消息,队列名字叫“消息队列1”
channel.queue_declare(queue='消息队列1') # 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据
channel.basic_publish(exchange='',
routing_key='消息队列1',
body='没有确认和持久化的消息队列生产者1')
print("消息队列1已经发送了消息")
# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接
connection.close()
生产者producer.py代码
执行生产者代码
pyhton3 /opt/rabbitmqtest/producer.py
访问web管理界面,登录,查看队列信息
http://192.168.160.135:15672/
消息队列1 idle 1 0 1 0.00/s
消费者consumer.py代码
import pika
# 建立与rabbitmq的连接
credentials = pika.PlainCredentials("yang","")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))
channel = connection.channel()
channel.queue_declare(queue="消息队列1") #定义一个处理消息的回调函数
def callbak(ch,method,properties,body):
print("消费者接收到了数据:%r"%body.decode("utf8"))
# 有消息来临,立即执行callbak,没有消息则夯住,等待消息
channel.basic_consume(callbak,queue="消息队列1",no_ack=True)#no_ack设置是否给消息队列确认处理正常
# 开始消费,接收消息
channel.start_consuming()
消费者consumer.py代码
执行消费者代码
pyhton3 /opt/rabbitmqtest/consumer.py
刷新管理界面,消息队列为空是不在显示此消息队列信息
(2)确认机制的生产者和消费者(无持久化)
生产者producer_ack.py
import pika
# 创建凭证,使用rabbitmq用户密码登录
credentials = pika.PlainCredentials("yang","")
# 新建连接到服务器ip
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))
# 创建频道
channel = connection.channel()
# 声明一个队列,用于接收消息,队列名字叫“消息队列2_ack”
channel.queue_declare(queue='消息队列2_ack') # 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据
channel.basic_publish(exchange='',
routing_key='消息队列2_ack',
body='没有持久化的确认机制生产者')
print("消息队列2_ack已经发送了消息")
# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接
connection.close()
生产者producer_ack.py
消费者consumer_ack.py
import pika
# 建立与rabbitmq的连接
credentials = pika.PlainCredentials("yang","")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))
channel = connection.channel()
channel.queue_declare(queue="消息队列2_ack") #定义一个处理消息的回调函数
def callbak(ch,method,properties,body):
print("消费者接收到了数据:%r"%body.decode("utf8")) #在处理完成之后,确认消息发送之前模拟异常错误
#int('asd') #确认机制的回复信息
ch.basic_ack(delivery_tag=method.delivery_tag)
# 有消息来临,立即执行callbak,没有消息则夯住,等待消息
channel.basic_consume(callbak,queue="消息队列2_ack",no_ack=False)#消息队列确认机制,需在回调函数进行确认
# 开始消费,接收消息
channel.start_consuming()
消费者consumer_ack.py
回调函数如果在处理之后确认之前发生异常抛错,则消息队列信息不删除,但实际已经处理,所以存在问题,实际认为没有正常处理
(3)持久化确认机制的生产者和消费者
持久化目的:在消息队列运行过程中,防止意外停止服务引起队列消息额丢失,从而进行持久化,重启后仍能看到
生产者producer_ack_durable.py
import pika
# 创建凭证,使用rabbitmq用户密码登录
credentials = pika.PlainCredentials("yang","")
# 新建连接到服务器ip
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))
# 创建频道
channel = connection.channel()
# 声明一个队列,用于接收消息,队列名字叫“消息队列_ack_durable”
channel.queue_declare(queue='消息队列_ack_durable',durable=True)# durable确保队列持久化 # 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据
channel.basic_publish(exchange='',
routing_key='消息队列_ack_durable',
body='持久化确认机制生产者',
# 支持数据持久化:代表消息是持久的 2
properties=pika.BasicProperties(delivery_mode=2,)
)
print("消息队列_ack_durable已经发送了消息")
# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接
connection.close()
生产者producer_ack_durable.py
消费者consumer_ack_durable.py
import pika
# 建立与rabbitmq的连接
credentials = pika.PlainCredentials("yang","")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))
channel = connection.channel()
channel.queue_declare(queue="消息队列3_ack_durable",durable=True)# durable确保队列持久化 #定义一个处理消息的回调函数
def callbak(ch,method,properties,body):
print("消息队列3_ack_durable消费者接收到了数据:%r"%body.decode("utf8")) #在处理完成之后,确认消息发送之前模拟异常错误
#int('asd') #确认机制的回复信息,告诉服务端已经取走数据
ch.basic_ack(delivery_tag=method.delivery_tag)
# 有消息来临,立即执行callbak,没有消息则夯住,等待消息
channel.basic_consume(callbak,queue="消息队列3_ack_durable",no_ack=False)#消息队列确认机制,需在回调函数进行确认
# 开始消费,接收消息
channel.start_consuming()
消费者consumer_ack_durable.py
python操作rabbitmq,实现生产消费者模型的更多相关文章
- Python——Queue模块以及生产消费者模型
1.了解Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 |queue.Qu ...
- Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型
Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: 每个对象都对应于一个可称为" 互斥锁&qu ...
- Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁
Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...
- Python之queue模块以及生产消费者模型
队列 队列类似于一条管道,元素先进先出,进put(arg),取get() 有一点需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态. 队列分类 队列有很多中,但都依赖 ...
- Python - Asyncio模块实现的生产消费者模型
[原创]转载请注明作者Johnthegreat和本文链接 在设计模式中,生产消费者模型占有非常重要的地位,这个模型在现实世界中也有很多有意思的对应场景,比如做包子的人和吃包子的人,当两者速度不匹配时, ...
- Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...
- python操作RabbitMQ(不错)
一.rabbitmq RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...
- Python操作 RabbitMQ、Redis、Memcache
Python操作 RabbitMQ.Redis.Memcache Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数 ...
- Python操作RabbitMQ
RabbitMQ介绍 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从“生产者”接收消息并传递消 ...
- python - 操作RabbitMQ
python - 操作RabbitMQ 介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Mess ...
随机推荐
- 解决linux(ubuntu18)下无法挂载ntfs磁盘,并读写挂载硬盘
首先需要有ntfs-3g,没有的话sudo apt-get install ntfs-3g 挂载硬盘: chen@ilaptop:/$ sudo mount -o rw,remount /dev/sd ...
- Fabric的6大特性
文章目录 什么是Hyperledger Fabric 1. 成员准入 2. 性能,可伸缩性和信任级别 3 需要了解的数据 4 通过不可变的分布式账本进行复杂查询 5 支持插件组件的模块化架构 6 保护 ...
- 运用shell脚本 执行sftp,ftp命令
sftp文件上传(从本地上传到远程) #!/bin/bash #远程上传文件测试 if [ $# -ne 2 ] then echo "miss arguments" echo & ...
- Linux笔记(shell基础,历史命令,命令补全/别名,通配符,输出重定向)
一.shell 基础 shell是个命令解释器,提供用户和机器之间的交互 每个用户都可以拥有自己特定的shell centos7默认Shell为bash(Bourne Agin shell) 除了ba ...
- JAVA_WEB--jsp概述
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动态网页技术 ...
- 解决Chrome插件安装时出现的“程序包无效”问题
问题原因,新版的插件头部文件的修改,导致旧版的插件包无法使用,解决方式:解压. 1.把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar(如果看不到Chrome插件的扩展 ...
- 分享一批国内常用的tracker地址
本期先分享一批国内能用地址,下一期我会出一期取代迅雷的下载的工具教程. udp://p4p.arenabg.com:1337/announce udp://tracker.tiny-vps.com:6 ...
- codeforce 1311 C. Perform the Combo 前缀和
You want to perform the combo on your opponent in one popular fighting game. The combo is the string ...
- 集训模拟赛-1-T1
最近学校网课跟得紧没时间写知识点,就拿题解凑个数(bushi 而且前两天我打着打着题解电脑就突然死机 幸运的是 我没有保存(微笑) 废话不多说 上题目! 城市攻击 (city) (256MB,1s) ...
- java读源码 之 map源码分析(HashMap,图解)一
开篇之前,先说几句题外话,写博客也一年多了,一直没找到一种好的输出方式,博客质量其实也不高,很多时候都是赶着写出来的,最近也思考了很多,以后的博客也会更注重质量,同时也尽量写的不那么生硬,能让大家 ...