36

私はpikaを使用するときにどの形式の接続を使用すべきかを理解しようとしてきましたが、私が理解している限り、2つの選択肢があります。

BlockingConnectionまたはのいずれかSelectConnectionですが、これら2つの違いについてはよくわかりません(つまり、BlockingConnectionブロッキングとは何ですか?など)

のドキュメントにpikaSelectConnection、「select、epoll、kqueue、pollなどの複数のイベント通知方法」が用意されているため、rabbitに接続するための推奨される方法であると記載されています。

では、これら2つの異なる種類の接続の意味は何でしょうか。

PS:タイトルにタグを付けるべきではないことは知っていますが、この場合、質問を明確にするのに役立つと思います。

4

2 に答える 2

28

SelectConnectionは、アプリケーションアーキテクチャが非同期設計の恩恵を受けることができる場合、たとえばRabbitMQ IOの完了中に何か他のことを行う場合(たとえば、他のIOへの切り替えなど)に役立ちます。このタイプの接続では、コールバックを使用して、関数がいつ戻るかを示します。たとえば、次のコールバックを宣言できます

on_connected、on_channel_open、on_exchange_declared、on_queue_declaredなど。

...これらのイベントがトリガーされたときに操作を実行します。

RabbitMQサーバー(またはそのサーバーへの接続)が遅いか過負荷になっている場合、この利点は特に効果的です。

一方のBlockingConnectionはまさにそれであり、呼び出された関数が戻るまでブロックします。そのため、たとえば、connected、channel_open、exchange_declared、queue_declaredが返されるまで、実行スレッドをブロックします。とは言うものの、この種のシリアル化されたロジックをプログラムする方が、非同期のSelectConnectionロジックよりも簡単なことがよくあります。レスポンシブRabbitMQサーバーを備えたシンプルなアプリの場合、これらはOKIMOでも機能します。

Pikaのドキュメントをすでに読んだことがあると思いますhttp://pika.readthedocs.io/en/stable/intro.htmlそうでない場合は、Pikaを使用する前にこれは絶対に重要な情報です。

乾杯!

于 2012-08-16T14:19:11.013 に答える
4

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()ハンドラーを選択することをお勧めします。

ハッピーコーディング!

于 2020-05-03T10:47:10.130 に答える