更多详情参考官方文档: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(ubuntu18)下无法挂载ntfs磁盘,并读写挂载硬盘

    首先需要有ntfs-3g,没有的话sudo apt-get install ntfs-3g 挂载硬盘: chen@ilaptop:/$ sudo mount -o rw,remount /dev/sd ...

  2. Fabric的6大特性

    文章目录 什么是Hyperledger Fabric 1. 成员准入 2. 性能,可伸缩性和信任级别 3 需要了解的数据 4 通过不可变的分布式账本进行复杂查询 5 支持插件组件的模块化架构 6 保护 ...

  3. 运用shell脚本 执行sftp,ftp命令

    sftp文件上传(从本地上传到远程) #!/bin/bash #远程上传文件测试 if [ $# -ne 2 ] then echo "miss arguments" echo & ...

  4. Linux笔记(shell基础,历史命令,命令补全/别名,通配符,输出重定向)

    一.shell 基础 shell是个命令解释器,提供用户和机器之间的交互 每个用户都可以拥有自己特定的shell centos7默认Shell为bash(Bourne Agin shell) 除了ba ...

  5. JAVA_WEB--jsp概述

    JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动态网页技术 ...

  6. 解决Chrome插件安装时出现的“程序包无效”问题

    问题原因,新版的插件头部文件的修改,导致旧版的插件包无法使用,解决方式:解压. 1.把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar(如果看不到Chrome插件的扩展 ...

  7. 分享一批国内常用的tracker地址

    本期先分享一批国内能用地址,下一期我会出一期取代迅雷的下载的工具教程. udp://p4p.arenabg.com:1337/announce udp://tracker.tiny-vps.com:6 ...

  8. 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 ...

  9. 集训模拟赛-1-T1

    最近学校网课跟得紧没时间写知识点,就拿题解凑个数(bushi 而且前两天我打着打着题解电脑就突然死机 幸运的是 我没有保存(微笑) 废话不多说 上题目! 城市攻击 (city) (256MB,1s) ...

  10. java读源码 之 map源码分析(HashMap,图解)一

    ​ 开篇之前,先说几句题外话,写博客也一年多了,一直没找到一种好的输出方式,博客质量其实也不高,很多时候都是赶着写出来的,最近也思考了很多,以后的博客也会更注重质量,同时也尽量写的不那么生硬,能让大家 ...