2

ドキュメントにあるように、ZMQ ソケットはスレッドセーフではありません。したがって、タイトルに対する答えは「いいえ」だと思います。

それでも、ZMQ を使用してノンブロッキングのリクエスト/リプライパターンを実装する方法がわかりません。

具体的には、クライアントには、(スレッド セーフな) メッセージ キューからのメッセージを処理するビジネスを行うメイン スレッドがあります。メッセージは、ネットワーク、タイマー、I/O などのさまざまなソースから送信されます。メイン スレッドがリモート サーバーに要求を送信したい場合がありますが、応答を待ちたくない場合があります (応答には時間がかかる場合があります)。 )。

通常、次の 2 つのスレッドを使用します。

  1. メインのメッセージ処理ループ スレッド。これはsend()REQ/REP ソケットで要求します
  2. サーバーからの応答を待機する補助リスナー スレッド。これは、ソケットでブロッキングを使用recv()し、メイン スレッドのキューに応答をプッシュします。

ZeroMQ を使用してこれを達成するにはどうすればよいですか? 補助スレッドはソケットを開きinproc、メイン スレッドからのメッセージをリッスンする必要がありますか?

4

1 に答える 1

2

実際、シングルスレッドで十分です。サーバーにリクエストを送信し、 でメッセージをポーリングするだけzmq_poll()です。

一度に 1 つの要求で十分な場合、このモデルは問題ありません。複数のリクエストを送信し、応答を非同期で読み取る必要がある場合は、REQ の代わりに DEALER ソケットを使用します。最初のフレームとして requestId を送信し、空の区切りフレームを追加してから、実際のリクエストを送信します。

ガイドの第 3 章には、REQ/REP メッセージ エンベロープの詳細が記載されています: http://zguide.zeromq.org/php:chapter3

これが十分に明確でない場合はお知らせください。おそらく、いくつかのコードサンプルで回答を拡張します。

于 2013-07-11T12:26:30.410 に答える