3

短いバージョン: リモート プロシージャ コールの状況で Pika をブロックしないようにするにはどうすればよいですか?

長いバージョン:

Pika の例はどれも、私のユース ケースを示していません。

AMQP(RabbitMQ、Pika)を介して他のプロセス/マシンと通信するTornadoサーバーがあります。これらの他のプロセスはあまり明確に定義されていませんが、ほとんどの場合、データを返します ( RabbitMQ の Web サイトの RPC の例を参照してください)。場合によっては、プロセスが大量の情報を処理するのに非常に長い時間がかかることがありますが、小さなリクエストがプロセスによって取得されるのを完全にブロックするべきではありません。または、リモート サーバーが Web 要求を送信したためにブロックされている可能性があります。Web サーバーのように考えてください。ただし、HTTP の代わりに AMQP を使用します。

Pika のドキュメントでは、スレッドセーフではないと主張しているため、接続を複数のスレッド (またはプロセス) に渡すことはできません。私がやりたいことは、Tornado でできるように、新しいプロセスを開始し、ソケット イベント (そのプログラムへのパイプ用) を Pika IOLoop に追加することです。Pika IOLoop は Tornado IOLoop とは大きく異なり、複数のハンドラーの追加をサポートしていないようです。1 つのソケットで 1 つの「ポーラー」を使用して動作しているようです。

IOLoop のみを使用するため、このパッケージに Tornado パッケージを要求することは避けたいと思います。それは問題外ではありませんが、他のオプションが何であるか、または複数の Pika IOLoops/Poller を何らかの方法で接続することによって問題の解決策があるかどうかを確認したいです。RabbitMQ のドキュメントには、多くの場合、ワーカーを追加することで「スケールアップ」できると書かれています。着信するすべてのリクエストに対して接続を作成することは避けたいと思います (リクエストが高速に着信する場合)。

4

1 に答える 1

0

あなたが説明したことから、残念ながら別の通信モデルが必要か、複数の Pika IOLoops/Pollers/Redundant Connections が必要だと思います。

ドキュメントや他のサイトから、Pika の RPC は常にブロック ステートメントであり、スレッド間で受け渡しできないようです。http://www.rabbitmq.com/tutorials/tutorial-six-python.htmlを参照してください。著者は、実際に ioloop を呼び出すと Pika の RPC が本質的にブロックされることを指摘しています。

"When in doubt avoid RPC. If you can, you should use an asynchronous pipeline - instead of RPC-like blocking"

1 つの接続が完了する前に、同じ接続で複数の RPC 呼び出しを送信し続けたい場合は、別の非同期モデルが必要になります。完了前に同じ接続で複数の RPC 呼び出しを行うことは、RPC モデルの通常の実装ではありませんが、技術的に禁止されているわけではありません ( http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic= %2Fcom.ibm.aix.progcomm%2Fdoc%2Fprogcomc%2Frpc_mod.htm )。Pika はこのモデルでは動作しないと思いますが、コールバックを介した非同期サポートがあります (あなたが探しているものではないと思います)。

その場で簡単に新しい接続を生成できるようにしたい場合は、接続でスレッドまたはプロセス ラッパーを使用できます。ここでは、他のコンテキストで RPC を作成してブロックし、メイン スレッドができる共通のキューにプッシュします。モニター。トルネードはこれを与えるかもしれませんが、それは少しやり過ぎであることに同意します.100行未満のPythonで他のI / O操作に対して同様のことを行ったので、そのような接続ラッパーを作成することはそれほど難しくないはずです(スレッド化されたラッパー バージョンのキュー パッケージを参照してください)。複数の IOLoops の話に基づいていますが、この可能性は既に見たと思います。

于 2012-07-19T20:36:28.733 に答える