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 ...
随机推荐
- JavaScript type="text/template"的用法
JavaScript type="text/template"相当于定义一个模板,如果没有使用html()方法的话,是显示不出来的,我们直接看例子(我是在tp框架的里面写的) &l ...
- 20199310《Linux内核原理与分析》第十五周作业 Linux安全实验
1 补充知识 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭, ...
- JAVA企业级应用TOMCAT实战(二)
使用普通用户运行 使用普通用户来部署服务是比较安全的做法 [root@tomcat application]# useradd -u tomcat [root@tomcat application]# ...
- 负载均衡服务之HAProxy访问控制ACL
前文我们聊到了haproxy的错误页的配置,自定义日志的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12797913.html:今天我们主要来看看hap ...
- 从实践出发:微服务布道师告诉你Spring Cloud与Boot他如何选择
背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. 系统架 ...
- 01-复杂度2 Maximum Subsequence Sum
01-复杂度2 Maximum Subsequence Sum (25分) 时间限制:200ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:陈越 单位:浙江大学 htt ...
- INTERVIEW #5
笔试 150min,3题,每题100分,自己果然还是个蒟蒻呢~ 最近状态好差,虽然做了一些题,但还是考得稀烂,大概有几点需要加强: 独立做题,不要一边看板子一边写代码,更不要一开始就看题解: 对之前研 ...
- CodeForces - 262B
Roma works in a company that sells TVs. Now he has to prepare a report for the last year. Roma has g ...
- python selenium(环境搭建)
一:自动化了解知识 工具安装 什么样的项目适合做自动化? 自动化测试一般在什么阶段开始实施? 你们公司自动化的脚本谁来维护?如何维护? 自动化用例覆盖率是多少? 自动化的原理 通过 webdriver ...
- 课堂管理系统;在线教辅平台;java课设
# 白泽智慧教辅平台 **说明:** 运行时需要修改位置: bzedu\src\main\resources\application.properties bzedu\src\main\resourc ...