В документации Pika достаточно четко описаны различия между типами подключения. Основное отличие состоит в том, что адаптер pika.adapters.blocking_connection.BlockingConnection()
используется для неасинхронного программирования, а адаптер pika.adapters.select_connection.SelectConnection()
используется для асинхронного программирования.
Если вы не знаете, в чем разница между неасинхронным/синхронным и асинхронным программированием, я предлагаю вам прочитать это вопрос или для более глубокого технического объяснения это статья.
Теперь давайте погрузимся в различные адаптеры Pika и посмотрим, что они делают. Для примера я предполагаю, что мы используем Pika для настройки клиентского соединения с RabbitMQ в качестве брокера сообщений AMQP.
Блокировка соединения ()
В следующем примере выполняется подключение к RabbitMQ, прослушивающему порт 5672 на localhost с использованием имени пользователя guest и пароля guest и виртуальный хост '/'. После подключения открывается канал, и сообщение публикуется на бирже test_exchange с использованием ключа маршрутизации test_routing_key. Передаваемое значение 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()
ВыбратьСоединение()
Напротив, использование этого адаптера подключения является более сложным и менее питоническим, но при использовании с другими асинхронными службами он может значительно повысить производительность. В следующем примере кода используются все те же параметры и значения, что и в предыдущем примере:
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()
Вывод
Для тех, кто занимается простым неасинхронным/синхронным программированием, адаптер BlockingConnection()
оказывается самым простым способом приступить к работе с Pika для публикации сообщений. Но если вы ищете способ реализовать асинхронную обработку сообщений, обработчик SelectConnection()
— ваш лучший выбор.
Удачного кодирования!
person
marcuse
schedule
03.05.2020