3

考えがある。以下のシナリオに従ってメッセージを処理する WebSocket ベースの RPC を記述します。

  1. クライアントは WS (Web ソケット) サーバーに接続します
  2. クライアントが WS サーバーにメッセージを送信する
  3. WS サーバーはメッセージを受信キューに入れます (マルチプロセッシング キューまたは RabbitMQ キューにすることができます)。
  4. プロセス プール内のワーカーの 1 つがメッセージを取得して処理します。
  5. メッセージが処理されています (非常に高速または非常に遅い場合があります。WS サーバーには関係ありません)。
  6. メッセージが処理された後、処理の結果が送信キューにプッシュされます
  7. WS サーバーはキューから結果をポップし、クライアントに送信します。

注:重要な点は、WS サーバーはノンブロッキングであり、次のことのみを担当する必要があるということです。

  • 接続受付
  • クライアントからメッセージを取得し、受信キューに入れる
  • 送信キューからメッセージを取り出してクライアントに送り返す

注 2:クライアント ID を何らかの方法で保存し、クライアントからのメッセージと共に渡すことをお勧めします。

注 3:メッセージを前後にキューイングするため、単純なメッセージ処理 (たとえば、メッセージを入力として取得し、結果としてそれをプッシュバックする) の速度が低下することはまったく問題ありません。ターゲットの目標は、高速メッセージを処理するのと同じコード スタイルを使用して、プールでプロセッサの負荷の高い操作 (実用的ではない大まかな例: いくつかのネストされた「for」ループ) を実行できるようにすることです。つまり、ある種のクライアント ID と一緒に入力キューからメッセージをポップし、それを処理し (時間がかかる場合があります)、処理結果をクライアント ID と一緒に出力キューにプッシュします。

質問:

  • TornadoWeb で、キュー (マルチプロセッシングまたは Rabit) がある場合、そのキューに新しい項目があるたびに Tornado の IOLoop にコールバックをトリガーさせるにはどうすればよいですか? 既存の実装がある場合は、そこに案内してもらえますか?
  • そのような設計のすぐに実装できるものはありますか? (トルネードとは限りません)
  • そのような設計を実装するには、別の言語 (python ではない) を使用する必要があるのでしょうか?

謝辞:

  • 達成しようとしている目標に REST と WSGI を使用するという推奨事項は歓迎されません
  • 「これは、2秒間グーグルで見つけたコードへのリンクです。トルネードとマルチプロセッシングからのインポートがいくつかあります。それが何をするのかはわかりませんが、99% の確率で、まさにあなたが必要としているものであると確信しています」も歓迎されません。
  • 通常のブロッキング ライブラリの代わりに非同期ライブラリを使用する推奨事項は ... :)
4

1 に答える 1

1

TornadoIOLoopでは、ファイル記述子によって任意のファイル オブジェクトからのイベントを処理できるため、これを試すことができます。

  • を通じて各ワーカープロセスに接続しますmultiprocessing.Pipe
  • add_handler各パイプの親エンドを呼び出す(接続の を使用fileno())
  • ワーカーが出力キューに何かを入れるたびに、multiprocessing.Queueそれが MQ のものであるかどうかに関係なく、ランダムなガベージを書き込むようにします。
  • イベント ハンドラーでワーカーからの回答を処理する
于 2012-08-16T19:45:55.833 に答える