关于python运用RabbitMQ

一、简单模式

1.安装pika模块

复制代码
pip install pika

2.启动rabbitMQ 服务

3.简易模式

生产者

1.链接rabbitmq

2.创建队列

3.向指定队列插入数据

ini 复制代码
import pika

#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

#2 创建队列
channel.queue_declare(queue='hello')

#3 向指定队列插入数据
channel.basic_publish(exchange='',# 简单模式
                      routing_key='hello',#指定队列
                      body='Hello World!')
                                                               

消费者

1.链接rabbitmq

2.创建队列 如果已经有这个队列就不执行 如果生产者没有这个队列就创建一个队列

3.定义回调函数

4.监听配置 有数据后执行回调

ini 复制代码
import pika

#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

#2 创建队列  如果已经有这个队列就不执行  如果生产者没有这个队列就创建一个队列
channel.queue_declare(queue='hello')

#定义回调函数
def callback(ch,method,properties,body):
    # 具体操作....

# 监听配置  有数据后执行回调
channel.basic_consume(queue='hello',
                      auto_ack=True,# 默认应答模式
					  on_message_callback=callback)# 回调函数

# 启动监听
channel.start_consuming()

3.参数

应答模式

auto_ack 参数:主要处理数据丢失 例消费者在回调函数中报错 由于数据已经取出 队列里无数据 造成数据丢失 此时可以采用手动应答 默认追求效率 手动注重安全

auto_ack=True 开启 默认 应答模式 代码如上 追求效率

auto_ack=False 开启 手动 应答模式 手动应答模式需在 回调函数最后加入ch.basic_ack(delivery_tag=method.delivery_tag) 用于确保回调执行成功后 清除数据

消费者

ini 复制代码
import pika

# ....

#定义回调函数
def callback(ch,method,properties,body):
    # 具体操作....成功后最后加入下面的话
    ch.basic_ack(delivery_tag=method.delivery_tag)

# 监听配置  有数据后执行回调
channel.basic_consume(queue='hello',
                      auto_ack=Flase,# 默认应答模式
					  on_message_callback=callback)# 回调函数

数据持久化

生产者

ini 复制代码
import pika

#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

#2 创建队列
channel.queue_declare(queue='hello',durable=True) #durable为True 为持久化

#3 向指定队列插入数据
channel.basic_publish(exchange='',
                      routing_key='hello',#需与queue一致
                      body='Hello World!',
                      properties=pika.BasicProperties(delivery_mode=2)#2指明message为持久的
                     )

delivery_mode 投递消息模式

1 . ram

2 . disc

分发参数

谁先快谁先获取,不是一个分发后阻塞等待

消费者

ini 复制代码
import pika

#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

#2 创建队列  如果已经有这个队列就不执行  如果生产者没有这个队列就创建一个队列
channel.queue_declare(queue='hello')

#3 定义回调函数
def callback(ch,method,properties,body):
    # 具体操作....成功后最后加入下面的话
    ch.basic_ack(delivery_tag=method.delivery_tag)
    
#4 公平分发 谁快谁先获取
channel.basic_qos(prefetch_count=1)

#5 监听配置  有数据后执行回调
channel.basic_consume(queue='hello',
                      auto_ack=Flase,# 默认应答模式
					  on_message_callback=callback)# 回调函数

4.交换机模式

发布订阅模式

由生产者 声明交换机 ,消费者声明队列 用队列绑定交换机 相当于 交换机是发布者 队列是订阅者

生产者
ini 复制代码
import pika

#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

#2 声明交换机 exchange交换机名字  exchange_type模式固定 
channel.exchange_declare(exchange="logs",exchange_type="fanout")

#3 向指定队列插入数据
channel.basic_publish(exchange='logs',# 向指定的交换机插入数据  
                      routing_key='',
                      body='Hello World!')

connection.close()

exchange_declare参数

exchange:交换机名字 可以任意

exchange_type:fanout为发布订阅模式 固定

basic_publish参数

exchange 向指定交换机插入数据 参数为交换机名字

消费者

1.链接rabbitmq

2.声明交换机 如果已经有这个交换机就不执行 如果生产者没有生命这个交换机就创建一个交换机

3.创建队列 第一个参数为空字符 exclusive为True 系统随机名字

4.将创建的队列绑定到交换机 queue为队列名字

5.定义回调函数

ini 复制代码
import pika

#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

#2 声明交换机 如果已经有这个交换机就不执行  如果生产者没有生命这个交换机就创建一个交换机
channel.exchange_declare(exchange="logs",exchange_type="fanout")

#3 创建队列 第一个参数为空字符 exclusive为True 系统随机名字
result=channel.queue_declare("",exclusive=True)
# 获取队列名字
queue_name=result.method.queue

#4 将创建的队列绑定到交换机 queue为队列名字
channel.queue_bind(exchange="logs",queue=queue_name)

#5 定义回调函数
def callback(ch,method,properties,body):
    # 具体操作....

# 监听配置  有数据后执行回调
channel.basic_consume(queue=queue_name,
                      auto_ack=True,# 默认应答模式
					  on_message_callback=callback)# 回调函数

# 启动监听
channel.start_consuming()

创建队列后 绑定交换机

注意:队列名字为 唯一值 所以建议使用queue_declare("",exclusive=True) 创建唯一值

关键字模式

和发布订阅模式相比,消费者的队列绑定 交换机时需要加入关键字 当发布消息 只有绑定响应的关键字的 队列才能收到消息

生产者

1.链接rabbitmq

2.声明交换机 exchange交换机名字必须和消费者保持一致 exchange_type模式固定

3.向指定队列插入数据 routing_key为关键字名字

ini 复制代码
import pika

#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

#2 声明交换机 exchange交换机名字必须和消费者保持一致  exchange_type模式固定 
channel.exchange_declare(exchange="logs",exchange_type="direct")

#3 向指定队列插入数据 routing_key为关键字名字  
channel.basic_publish(exchange='logs',# 向指定的交换机插入数据  
                      routing_key='info',
                      body='Hello World!')

connection.close()
消费者

1.链接rabbitmq

2.声明交换机 如果已经有这个交换机就不执行 如果生产者没有生命这个交换机就创建一个交换机 !!! 交换机名字必须和消费者保持一致

3.创建队列 第一个参数为空字符 exclusive为True 系统随机名字

4.将创建的队列绑定到交换机 queue为队列名字,获取关键字为info 的信息

5.定义回调函数

ini 复制代码
import pika

#1 链接rabbitmq
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

#2 声明交换机 如果已经有这个交换机就不执行  如果生产者没有生命这个交换机就创建一个交换机
#!!! 交换机名字必须和消费者保持一致
channel.exchange_declare(exchange="logs",exchange_type="fanout")

#3 创建队列 第一个参数为空字符 exclusive为True 系统随机名字
result=channel.queue_declare("",exclusive=True)
# 获取队列名字
queue_name=result.method.queue

#4 将创建的队列绑定到交换机 queue为队列名字,获取关键字为info 的信息
channel.queue_bind(exchange="logs",queue=queue_name,routing_key="info")
#如果需要绑定多个 需要声明多个
#channel.queue_bind(exchange="logs",queue=queue_name,routing_key="warning")

#5 定义回调函数
def callback(ch,method,properties,body):
    # 具体操作....

# 监听配置  有数据后执行回调
channel.basic_consume(queue=queue_name,
                      auto_ack=True,# 默认应答模式
					  on_message_callback=callback)# 回调函数

# 启动监听
channel.start_consuming()

一次性只能绑定一个关键字

通配符模式

相关推荐
Mahir0820 小时前
MyBatis 分页与插件深度解密:从插件机制到三大分页方案原理全解
java·后端·mybatis·mybatis-plus·大厂面试题
折哥的程序人生 · 物流技术专研21 小时前
《Java 100 天进阶之路》第40篇:浮点数转成十进制问题
java·开发语言·后端·面试·求职招聘
ZengLiangYi21 小时前
任务队列设计:p-queue 限速 + 重试策略
前端·javascript·后端
XovH21 小时前
Docker Compose 文件详解:服务、网络与卷
后端
楼田莉子21 小时前
C++20现代特性:概念与约束
开发语言·c++·后端·学习·c++20
Dante丶21 小时前
Codex Desktop 不断 Reconnecting 的代理环境变量处理
前端·后端·代码规范
XovH21 小时前
Docker Compose 入门:一条命令启动多服务
后端
Yeats_Liao21 小时前
6:部署Servlet-Java Web
java·后端·架构
XovH21 小时前
Docker 网络入门:桥接、自定义与主机网络
后端
用户21816970493021 小时前
golang socket(三) TCP协议 实现聊天功能 TCPConn
后端