python使用pika库调用rabbitmq交换机模式详解

 更新时间:2022年08月31日 16:12:14   作者:IT之一小佬  
这篇文章主要介绍了python使用pika库调用rabbitmq交换机模式详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下

前言:

交换机模式主要包括:交换机之发布订阅、交换机之关键字和交换机之通配符。

1、交换机之发布订阅

 发布订阅和简单的消息队列区别在于,发布订阅会将消息发送给所有的订阅者,而消息队列中的数据被消费一次便消失。所以,RabbitMQ实现发布和订阅时,会为每一个订阅者创建一个队列,而发布者发布消息时,会将消息放置在所有相关队列中。

生产者模式:

示例代码:

import pika
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的fanout的交换机
channel.exchange_declare(exchange='logs', exchange_type='fanout')  # 发布订阅模式参数
 
# 3.向logs交换机中插入数据:"Hello world"
message = 'info:Hello World!'
channel.basic_publish(exchange='logs',
                      routing_key='',
                      body=message,
                      properties=pika.BasicProperties(
                          delivery_mode=2,  # make message persistent
                      )
                      )
print(" [x] Sent 'Hello World!'")

运行结果:

消费者模式:

示例代码:

import pika
 
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的fanout的交换机
channel.exchange_declare(exchange='logs', exchange_type='fanout')
 
# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)
 
# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs', queue=queue_name)
 
# 5.确定回调函数
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    ch.basic_ack(delivery_tag=method.delivery_tag)

# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列
                      auto_ack=False,  # 手动应答方式
                      on_message_callback=callback)
print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:【将程序重复执行三次,三个消费者都收到了同样的消息】

2、交换机之关键字

生产者模式:

示例代码:  【将info分别改为warning、error运行】

import pika
 
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的direct的交换机
channel.exchange_declare(exchange='logs2', exchange_type='direct')  # 发布订阅模式参数
 
# 3.向logs交换机中插入数据:"Hello world"
message = 'info:Hello World!'
channel.basic_publish(exchange='logs2',
                      routing_key='info',  # info信息
                      body=message,
                      properties=pika.BasicProperties(
                          delivery_mode=2,  # make message persistent
                      )
                      )
print(" [x] Sent 'Hello World!'")

运行结果:

消费者模式:

示例代码1:

import pika
 
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的direct的交换机
channel.exchange_declare(exchange='logs2', exchange_type='direct')
 
# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)
 
# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='info')
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='waring')
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='error')
 
# # 使用for循环将指定队列绑定到交换机上
# for key in ['info', 'waring', 'error']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)
 
# 5.确定回调函数
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    ch.basic_ack(delivery_tag=method.delivery_tag)
 
# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列
                      auto_ack=False,  # 手动应答方式
                      on_message_callback=callback)
print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

示例代码2:

import pika
 
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的direct的交换机
channel.exchange_declare(exchange='logs2', exchange_type='direct')
 
# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)
 
# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='info')
 
# # 使用for循环将指定队列绑定到交换机上
# for key in ['info', 'waring', 'error']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)
# 5.确定回调函数
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    ch.basic_ack(delivery_tag=method.delivery_tag)

# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列
                      auto_ack=False,  # 手动应答方式
                      on_message_callback=callback)
print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

示例代码3:

import pika
 
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的direct的交换机
channel.exchange_declare(exchange='logs2', exchange_type='direct')
 
# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)
 
# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs2', queue=queue_name, routing_key='error')
 
# # 使用for循环将指定队列绑定到交换机上
# for key in ['info', 'waring', 'error']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)
 
# 5.确定回调函数
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    ch.basic_ack(delivery_tag=method.delivery_tag)
 
# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列
                      auto_ack=False,  # 手动应答方式
                      on_message_callback=callback)
print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

3、交换机之通配符

通配符交换机”与之前的路由模式相比,它将信息的传输类型的key更加细化,以“key1.key2.keyN....”的模式来指定信息传输的key的大类型和大类型下面的小类型,让消费者可以更加精细的确认自己想要获取的信息类型。而在消费者一段,不用精确的指定具体到哪一个大类型下的小类型的key,而是可以使用类似正则表达式(但与正则表达式规则完全不同)的通配符在指定一定范围或符合某一个字符串匹配规则的key,来获取想要的信息。

“通配符交换机”(Topic Exchange)将路由键和某模式进行匹配。此时队列需要绑定在一个模式上。符号“#”匹配一个或多个词,符号“*”仅匹配一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*”只会匹配到“audit.irs”。(这里与一般的正则表达式的“*”和“#”刚好相反,这里我们需要注意一下。)

生产者模式:

示例代码:  【分别将routing_key改为usa.news、news.usa和usa.weather执行一遍】

import pika
 
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的topic的交换机
channel.exchange_declare(exchange='logs3', exchange_type='topic')  # 发布订阅模式参数
 
# 3.向logs交换机中插入数据:"Hello world"
message = 'usa.news---------'
channel.basic_publish(exchange='logs3',
                      routing_key='usa.news',  # usa.news
                      body=message,
                      properties=pika.BasicProperties(
                          delivery_mode=2,  # make message persistent
                      )
                      )
print(" [x] Sent 'Hello World!'")

运行结果:

消费者模式:

示例代码1:

import pika
 
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的topic的交换机
channel.exchange_declare(exchange='logs3', exchange_type='topic')
 
# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)
 
# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs3', queue=queue_name, routing_key='news.#')
 
# # 使用for循环将指定队列绑定到交换机上
# for key in ['info.#', 'waring.#', 'error.#']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)
# 5.确定回调函数
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    ch.basic_ack(delivery_tag=method.delivery_tag)
 
 
# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列
                      auto_ack=False,  # 手动应答方式
                      on_message_callback=callback)
 
print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

示例代码2:

import pika
 
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的topic的交换机
channel.exchange_declare(exchange='logs3', exchange_type='topic')
 
# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)
 
# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs3', queue=queue_name, routing_key='#.news')
 
# # 使用for循环将指定队列绑定到交换机上
# for key in ['info.#', 'waring.#', 'error.#']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)

# 5.确定回调函数
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    ch.basic_ack(delivery_tag=method.delivery_tag)
# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列
                      auto_ack=False,  # 手动应答方式
                      on_message_callback=callback)
print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

示例代码3:

import pika
 
# 1.连接rabbit
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.124.104'))
channel = connection.channel()
 
# 2.声明一个名为logs类型的topic的交换机
channel.exchange_declare(exchange='logs3', exchange_type='topic')
 
# 3.创建队列
result = channel.queue_declare("", exclusive=True)  # 随机生成一个队列名
queue_name = result.method.queue
print(queue_name)
 
# 4.将指定队列绑定到交换机上
channel.queue_bind(exchange='logs3', queue=queue_name, routing_key='#.weather')
 
# # 使用for循环将指定队列绑定到交换机上
# for key in ['info.#', 'waring.#', 'error.#']:
#     channel.queue_bind(exchange='logs2', queue=queue_name, routing_key=key)

# 5.确定回调函数
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    ch.basic_ack(delivery_tag=method.delivery_tag)
 
 
# 6.确定监听队列参数
channel.basic_consume(queue=queue_name,  # 指定队列
                      auto_ack=False,  # 手动应答方式
                      on_message_callback=callback)
print(' [*] Waiting for messages. To exit press CTRL+C')
# 7.正式监听
channel.start_consuming()

运行结果:

到此这篇关于python使用pika库调用rabbitmq交换机模式详解的文章就介绍到这了,更多相关python rabbitmq交换机模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python批量提交沙箱问题实例

    python批量提交沙箱问题实例

    这篇文章主要介绍了python批量提交沙箱问题实例,针对批量提交沙箱出现的问题进行了针对性的分析与实例讲解,具有不错的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • python实现俄罗斯方块小游戏

    python实现俄罗斯方块小游戏

    这篇文章主要为大家详细介绍了python实现俄罗斯方块小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解

    这篇文章给大家演示了如何安装以及使用Python中操作mysql的pymysql模块,本文介绍的很详细,对大家学习Python具有一定参考借鉴价值,有需要的朋友们一起来看看吧。
    2016-09-09
  • Python中的struct.unpack示例详解

    Python中的struct.unpack示例详解

    在Python中,struct.unpack是一个函数,用于将字节串转换为元组,这个函数在处理二进制数据时非常有用,这篇文章主要介绍了Python中的struct.unpack示例详解,需要的朋友可以参考下
    2023-12-12
  • 一篇文章带你了解python元组基础

    一篇文章带你了解python元组基础

    今天小编就为大家分享一篇关于Python中的元组介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-08-08
  • Python实现的随机森林算法与简单总结

    Python实现的随机森林算法与简单总结

    这篇文章主要介绍了Python实现的随机森林算法,结合实例形式详细分析了随机森林算法的概念、原理、实现技巧与相关注意事项,需要的朋友可以参考下
    2018-01-01
  • Python制作动态字符图的实例

    Python制作动态字符图的实例

    今天小编就为大家分享一篇关于Python制作动态字符图的实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 你需要学会的8个Python列表技巧

    你需要学会的8个Python列表技巧

    这篇文章主要介绍了8个常用的Python列表技巧,文中讲解非常详细,帮助大家更好的学习Python,感兴趣的朋友可以了解下
    2020-06-06
  • 15个Pythonic的代码示例(值得收藏)

    15个Pythonic的代码示例(值得收藏)

    这篇文章主要介绍了15个Pythonic的代码示例(值得收藏),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Python基础实战总结

    Python基础实战总结

    今天要给大家介绍的是Python基础实战,本文主要以举例说明讲解:问题的关键点就是在于构造姓名,学号和成绩,之后以字典的形式进行写入文件。这里准备两个列表,一个姓,一个名,之后使用random库进行随机字符串拼接,得到姓名,需要的朋友可以参考一下
    2021-10-10

最新评论