RabbitMQ python运用

一、简单模式

1.安装pika模块

pip install pika

2.启动rabbitMQ 服务

3.简易模式

生产者
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!')
                                                               
消费者
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) 用于确保回调执行成功后 清除数据

消费者

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)# 回调函数

数据持久化

生产者

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

分发参数

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

消费者

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.交换机模式

发布订阅模式

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

生产者
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 向指定交换机插入数据 参数为交换机名字

消费者
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) 创建唯一值

关键字模式

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

生产者
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()
消费者
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()

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

通配符模式
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

街头炒河粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值