与鼠兔使用哪种形式的连接

Dan*_*roa 28 python rabbitmq pika

我一直试图找出使用鼠兔时应该使用哪种形式的连接,据我所知,我有两种选择.

无论是BlockingConnectionSelectConnection,但是我真的不知道有关之间的差异这两个(即什么是BlockingConnection阻止?多)

pika说的文件SelectConnection是连接到兔子的首选方式,因为它提供了"多种事件通知方法,包括select,epoll,kqueue和poll".

所以我想知道这两种不同类型的连接有什么含义?

PS:我知道我不应该在标题中添加标签,但在这种情况下,我认为它确实有助于澄清问题.

小智 21

如果您的应用程序架构可以从异步设计中受益,例如在RabbitMQ IO完成时执行其他操作(例如切换到其他IO等),则SelectConnection非常有用.这种类型的连接使用回调来指示函数何时返回.例如,您可以声明回调

on_connected,on_channel_open,on_exchange_declared,on_queue_declared等.

...触发这些事件时执行操作.

如果您的RabbitMQ服务器(或与该服务器的连接)缓慢或过载,那么这样做的好处尤其明显.

手上的BlockingConnection就是这样 - 它会一直阻塞,直到被调用的函数返回.所以它会阻塞执行线程,直到connect或channel_open或exchange_declared或queue_declared返回为例.也就是说,编程这种序列化逻辑通常比异步SelectConnection逻辑更简单.对于具有响应式RabbitMQ服务器的简单应用程序,这些也可以正常工作.

我想你已经阅读了Pika文档http://pika.readthedocs.io/en/stable/intro.html,如果没有,那么在你使用Pika之前这绝对是至关重要的信息!

干杯!


mar*_*use 7

Pika 文档非常清楚地说明了连接类型之间的差异。主要区别在于pika.adapters.blocking_connection.BlockingConnection()适配器用于非异步编程和适配器pika.adapters.select_connection.SelectConnection()用于异步编程。

如果您不知道非异步/同步和异步编程之间的区别,我建议您阅读此问题或获取本文更深入的技术解释。

现在让我们深入研究不同的 Pika 适配器并看看它们的作用,出于示例目的,我想象我们使用 Pika 与RabbitMQ作为 AMQP 消息代理建立客户端连接。

阻塞连接()

在以下示例中,使用用户名guest、密码guest和虚拟主机“/”建立到 RabbitMQ 的连接,监听本地主机上的端口5672。连接后,将打开一个通道,并使用test_routing_key路由密钥将消息发布到test_exchange交换。传入的 BasicProperties 值将消息设置为传递模式 1(非持久),内容类型为text/plain。消息发布后,连接将关闭:

import pika

parameters = pika.URLParameters('amqp://guest:guest@localhost:5672/%2F')

connection = pika.BlockingConnection(parameters)

channel = connection.channel()

channel.basic_publish('test_exchange',
                      'test_routing_key',
                      'message body value',
                      pika.BasicProperties(content_type='text/plain',
                                           delivery_mode=1))

connection.close()
Run Code Online (Sandbox Code Playgroud)

选择连接()

相比之下,使用这个连接适配器更加复杂并且不太Pythonic,但是当与其他异步服务一起使用时,它可以带来巨大的性能提升。在以下代码示例中,使用了与上一个示例中使用的所有相同的参数和值:

import pika

# Step #3
def on_open(connection):

    connection.channel(on_open_callback=on_channel_open)

# Step #4
def on_channel_open(channel):

    channel.basic_publish('test_exchange',
                            'test_routing_key',
                            'message body value',
                            pika.BasicProperties(content_type='text/plain',
                                                 delivery_mode=1))

    connection.close()

# Step #1: Connect to RabbitMQ
parameters = pika.URLParameters('amqp://guest:guest@localhost:5672/%2F')

connection = pika.SelectConnection(parameters=parameters,
                                   on_open_callback=on_open)

try:

    # Step #2 - Block on the IOLoop
    connection.ioloop.start()

# Catch a Keyboard Interrupt to make sure that the connection is closed cleanly
except KeyboardInterrupt:

    # Gracefully close the connection
    connection.close()

    # Start the IOLoop again so Pika can communicate, it will stop on its own when the connection is closed
    connection.ioloop.start()
Run Code Online (Sandbox Code Playgroud)

结论

对于那些进行简单的非异步/同步编程的人来说,BlockingConnection()适配器被证明是启动并运行 Pika 来发布消息的最简单方法。但如果您正在寻找一种实现异步消息处理的方法,那么SelectConnection()处理程序是您更好的选择。

快乐编码!