更多详情参考官方文档: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. ajaxReturn案例

    请查看:http://www.cnblogs.com/bushe/p/4625097.html 不用自己写json格式啦,直接拿这个用就可以啦

  2. 通过纯css实现图片居中的多种实现方式

    html结构: <div class="demo" style="width: 800px;height: 600px; border:1px solid #ddd ...

  3. 基于centos7搭建kvm

    其他的和安装一般的系统没有差别 安装完成后. 1]使用ping www.baidu.com 2]修改静态ip,也可以不修改 3]下载brctlyum -y install bridge-utils 4 ...

  4. Windows API Index

    https://docs.microsoft.com/en-us/windows/desktop/apiindex/windows-api-list

  5. mac OS 安装破解 Navicat Premium

    Navicat Premium for mac V12.0.24 中文破解版 下载地址 https://www.cnblogs.com/huihuizhang/p/9889780.html 由于新版本 ...

  6. 简单的环绕散射 Simple Wrap Diffuse From GPU GEMS1

    简单的环绕漫反射光照,实现起来特别简单,在Shader中加入以下几行:  float diffuse = max(0,dot(L,N));  float wrap_diffuse = max(0, ( ...

  7. 全面解析Java语言 Java技能优化集锦

    通用篇 "通用篇"讨论的问题适合于大多数Java应用. 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用.但如果一个对象实现了C ...

  8. unittest 管理用例生成测试报告

    # 登录方法的封装 from appium import webdriver from time import sleep from python_selenium.Slide import swip ...

  9. badboy 录制脚本

    第一步:介绍badboy工具 1.1: 页面功能分析: 1. 界面视图,模拟浏览器,能够进行操作 2. 需要录制脚本的URL 3. 点击运行URL 4. Summary:运行的各指标,响应时间,成功事 ...

  10. Java——Spring超详细总结

    Spring概述 一.简化Java开发 Spring为了降低Java开发的复杂性,采用了以下四种策略 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面和惯例进行声明 ...