Pikaのドキュメントは、接続タイプ間の違いについて非常に明確です。主な違いは、pika.adapters.blocking_connection.BlockingConnection()
アダプターが非同期プログラミングに使用されることと、pika.adapters.select_connection.SelectConnection()
アダプターが非同期プログラミングに使用されることです。
非非同期/同期プログラミングと非同期プログラミングの違いがわからない場合は、この質問を読むか、この記事の技術的な説明を読むことをお勧めします。
次に、さまざまなPikaアダプターについて詳しく見ていきましょう。例として、AMQPメッセージブローカーとしてRabbitMQとのクライアント接続をセットアップするためにPikaを使用することを想像します。
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()
対照的に、この接続アダプターの使用はより複雑でPython的ではありませんが、他の非同期サービスと併用すると、パフォーマンスが大幅に向上する可能性があります。次のコード例では、前の例で使用したものと同じパラメーターと値がすべて使用されています。
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()
ハンドラーを選択することをお勧めします。
ハッピーコーディング!