Pika文档非常清楚地介绍了连接类型之间的区别。 主要区别是
pika.adapters.blocking_connection.BlockingConnection()
适配器用于非异步编程,而
pika.adapters.select_connection.SelectConnection()
适配器用于异步编程。
如果您不知道非异步/同步和异步编程之间的区别,我建议您阅读这个问题或者更深入的技术解释可以参考这篇文章。
现在让我们深入了解不同的Pika适配器以及它们的作用,为了举例说明,我假设我们使用Pika来设置与RabbitMQ作为AMQP消息代理的客户端连接。
BlockingConnection()
在下面的示例中,使用用户名guest和密码guest以及虚拟主机'/'连接到监听本地主机上端口5672的RabbitMQ。 连接成功后,打开一个通道并使用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()
SelectConnection()
相比之下,使用这个连接适配器需要更多的步骤,且不够Pythonic。但是,当与其他异步服务一起使用时,它可以有巨大的性能提升。在以下代码示例中,使用了与先前示例中相同的参数和值:
import pika
def on_open(connection):
connection.channel(on_open_callback=on_channel_open)
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()
parameters = pika.URLParameters('amqp://guest:guest@localhost:5672/%2F')
connection = pika.SelectConnection(parameters=parameters,
on_open_callback=on_open)
try:
connection.ioloop.start()
except KeyboardInterrupt:
connection.close()
connection.ioloop.start()
结论
对于那些进行简单、非异步/同步编程的人来说,BlockingConnection()
适配器是使用Pika发布消息最简单的方法。但是,如果你正在寻找一种实现异步消息处理的方法,那么SelectConnection()
处理程序是更好的选择。
编码愉快!