クライアントはどのようにしてzeromqで返信を購読して聞くことができますか? つまり、クライアント側では、メッセージを受信して選択的に要求を送信するループを実行したいと思います。サーバー側では、ほとんどの時間を公開したいのですが、時には要求も受け取ることがあります。 私は2つの異なるソケットを持つ必要があるように見えます - それぞれの通信モードに1つ。それを避けることは可能ですか?サーバサイドでは、自分のスレッドでソケットにメッセージをプッシュしている間に、ゼロリクエストコールバックスレッドのソケットから「リクエスト通知」を受け取りますか?zeromqでreq/repとpub/subを組み合わせる
答えて
私はZeroMQを新しくしているので、あなたが望むものがベストプラクティスかどうかは分かりません。しかし、複数のソケットを使用するソリューションは、zmq_poll
を使用すると非常に簡単です。
基本的な考え方は、クライアントとサーバーの両方を持っているだろう:
- は
- サブパブ/用のソケットを開く
- REQ /担当者のためのソケットを開くマルチプレックスは、2つのソケットの間で送受信します彼らが起こるようにループ内の無限ループに
- プロセスREQ/repおよびパブ/サブイベントを
zmq_poll
を用いてループ内
zmq_poll
を複数のソケットでこのように使用すると、スレッドを完全に避けることができます。 0MQガイドはgood example hereです。この例では、zmq_poll
にタイムアウト値-1
を使用しているため、マルチプレックスされたソケットで少なくとも1つのイベントが発生するまでブロックされますが、ループが必要な場合はタイムアウト値としてxミリ秒他にもいくつかの仕事をしています。
2つのスレッドを使用して、異なるソケットを処理できます。スレッド間でデータを共有する必要がある場合は、安全に同期させる必要があります。
代わりに、ZeroMQポーラーを使用して、新しいデータを持つソケットを選択することができます。このプロセスでは、bjlaubが説明した方法で単一のループを使用します。
これは、Majordomo Protocolのバリエーション/サブセットを使用して達成できます。
サーバーはルータソケットになり、クライアントはディーラーソケットになります。サーバーに接続すると、クライアントは何らかの種類のサブスクリプションまたは "hello"メッセージ(デザインの)を送信する必要があります。サーバはそのパケットを受信するが(router socket)、そのクライアントのIDも受信する。サーバーが(設計を通じて)そのクライアントに何かを送信する必要がある場合、サーバーはそのIDにそれを送信します。クライアントはディーラーソケットであるため、自由に送受信できます。
- 1. 配列と組み合わせパターンの組み合わせを見つける
- 2. Python itertoolsの組み合わせの組み合わせ
- 3. データウェアハウス:冗長な組み合わせの組み合わせ
- 4. メテオとエクスプレスを組み合わせる
- 5. ec2とlinodeを組み合わせる
- 6. mod_accessとmod_authを組み合わせる
- 7. ドラッグアンドドロップとスケーリングを組み合わせる
- 8. * -servlet.xmlとapplicationContext.xmlを組み合わせる
- 9. MatplotlibとPyQt4を組み合わせる
- 10. イベントとプロミスを組み合わせる
- 11. DIとコンストラクタパラメータを組み合わせる?
- 12. itertoolsとマルチプロセッシングを組み合わせる?
- 13. ANDとORを組み合わせる
- 14. JavaScriptとlessを組み合わせる
- 15. VLOOKUPとフィルターを組み合わせる
- 16. intをvoidと組み合わせる*
- 17. @Providesと@Injectを組み合わせる
- 18. Reactとネイティブアプリを組み合わせる
- 19. AQGridViewとHJCacheを組み合わせる
- 20. ctypesとswigを組み合わせる
- 21. link_toとrender:partialを組み合わせる
- 22. asmxとCodeBehindを組み合わせる
- 23. javascriptとjqueryを組み合わせる
- 24. wp_trim_wordsとwp_strip_all_tagsを組み合わせる
- 25. 交差と組合のタイプを組み合わせる方法
- 26. クエリの組み合わせを組み合わせるためのLinq構文
- 27. 組み合わせるヘッダとはhtmlspecialchars
- 28. 組み合わせると、別のクエリデータ
- 29. コンパススプライトでクラスセレクタを組み合わせる?
- 30. 列の組み合わせの組み合わせデータフレームの行ではない
私はRubyでスレッドを試しました。最初のsocket.recvはメイン(アプリケーション)を含むすべてのスレッドをブロックします... – MickaelFM
@MickTaiwan Rubyのバインディング、Rubyのスレッド、またはあなたのコードに問題があります。私はスレッドを使用して、Javaで異なるソケットを使用しています。 – Joshua
私はスレッドで動作するいくつかの例を読んでいますが、 "ffi-rzmq"ではなく、ruby gem "zmq"ではありません。 – MickaelFM