更多详情参考官方文档: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,实现生产消费者模型的更多相关文章

  1. Python——Queue模块以及生产消费者模型

    1.了解Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 |queue.Qu ...

  2. Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型

    Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: ​ ​ ​ 每个对象都对应于一个可称为" 互斥锁&qu ...

  3. Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁

    Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...

  4. Python之queue模块以及生产消费者模型

    队列 队列类似于一条管道,元素先进先出,进put(arg),取get() 有一点需要注意的是:队列都是在内存中操作,进程退出,队列清空,另外,队列也是一个阻塞的形态. 队列分类 队列有很多中,但都依赖 ...

  5. Python - Asyncio模块实现的生产消费者模型

    [原创]转载请注明作者Johnthegreat和本文链接 在设计模式中,生产消费者模型占有非常重要的地位,这个模型在现实世界中也有很多有意思的对应场景,比如做包子的人和吃包子的人,当两者速度不匹配时, ...

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

    Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy   Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用 ...

  7. python操作RabbitMQ(不错)

    一.rabbitmq RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  8. Python操作 RabbitMQ、Redis、Memcache

    Python操作 RabbitMQ.Redis.Memcache Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数 ...

  9. Python操作RabbitMQ

    RabbitMQ介绍 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从“生产者”接收消息并传递消 ...

  10. python - 操作RabbitMQ

    python - 操作RabbitMQ     介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.MQ全称为Mess ...

随机推荐

  1. Linux系统进入救援模式

    由于现在很多的服务器都是用的RedHat,CentOS也比较多,这里就介绍CentOS6.6的救援模式. 有很多人的linux在用的时候不小心修改了某个权限,导致系统启动不起来,下面我就来为大家解决一 ...

  2. 关于CompletableFuture的一切,看这篇文章就够了

    文章目录 CompletableFuture作为Future使用 异步执行code 组合Futures thenApply() 和 thenCompose()的区别 并行执行任务 异常处理 java中 ...

  3. Linux系统目录结构:目录层次标准、常用目录和文件

    1. 目录层次标准FHS FHS(Filesystem Hierarchy Standard)目录层次标准,是Linux的目录规范标准.   FHS定义了两层规范: 第一层:是"/" ...

  4. Python3 字符串格式化(%操作符)

    格式符 格式符为真实值预留位置,并控制显示的格式.格式符可以包含有一个类型码,用以控制显示的类型,如下: %s    字符串 (采用str()的显示) %r    字符串 (采用repr()的显示) ...

  5. 【Linux常见命令】tr命令

    tr - translate or delete characters tr 命令用于转换或删除文件中的字符. tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备. 语法: ...

  6. Linux指令面试题01-进程查看与终止

    查看某一进程是否运行:ps -ef|grep 程序名 终止程序: kill pid 转载于:https://www.cnblogs.com/feihujiushiwo/p/10896636.html

  7. iOS架构入门 - MVC模式实例演示

    MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除此之外,此模式通过对复杂度的简化,使程序结构更加直观 控制器(Controller)-- ...

  8. Computational Geometry

    矩形重叠 看过某司一道笔试题:给\(n\)个矩形左下和右上坐标(不能斜放),求重叠最多处矩形个数. 这道题本身不难:可以遍历所有矩形边界组成的点,计算该点被多少矩形包围,从而选出最大值. 由此引申出一 ...

  9. Alink漫谈(一) : 从KMeans算法实现不同看Alink设计思想

    Alink漫谈(一) : 从KMeans算法实现不同看Alink设计思想 目录 Alink漫谈(一) : 从KMeans算法实现不同看Alink设计思想 0x00 摘要 0x01 Flink 是什么 ...

  10. 使用Codemirror打造Markdown编辑器

    前几天突然想给自己的在线编译器加一个Markdown编辑功能,于是花了两三天敲敲打打初步实现了这个功能. 一个Markdown编辑器需要有如下常用功能: 粗体 斜体 中划线 标题 链接 图片 引用 代 ...