3

私の問題は、zmqソケットを半分閉じようとするようなものです。

簡単に言えば、PythonにはPUSH/PULLソケットのペアがあります。
PUSHソケットは送信を停止しませんが、PULLソケットは次の方法でそれ自体をクリーンアップできる必要があります。

  1. キューへの追加メッセージの受け入れを停止します
  2. キューに残っているメッセージを処理する
  3. ソケットなどを閉じます。

PUSHソケットに影響を与えたくはありません。別のPULLソケットが発生するか、すでに存在する可能性があるまで、独自のキューを蓄積し続けることができます。LINGERオプションはrecv()では機能しないようです(send()でのみ)。

1つのオプションは、ブローカーPUSHとレシーバーPULLHWMをゼロに設定してブローカーを間に置くことです。次に、ブローカーのPULLがメッセージを蓄積します。しかし、私はむしろこれをしたくありません。他に方法はありますか?

4

1 に答える 1

0

メッセージをキューに入れるソケットの種類を混乱させていると思います。zmq_socketのドキュメントによると、PUSH ソケットはメッセージをキューに入れますが、PULL ソケットにはキューイング メカニズムのタイプはありません。

したがって、あなたができることを求めているのは、次のようなものです。

1) PULLソケットへの追加メッセージの受信を停止します。2) ソケットなどを閉じます。

PUSH ソケットは、HWM が満たされる (ブロックされ、それ以上メッセージをキューに入れなくなる) か、PULL ソケットが来てメッセージの受信を開始するまで、メッセージを自動的に「キューに入れ」続けます。

あなたが本当に心配していると思うのは、遅い PULL リーダーです。PUSH ソケットで現在キューに入れられているすべてのメッセージを取得して (一度に?)、終了したい場合。これは zmq の仕組みではなく、一度に 1 つのメッセージを受け取ります。

この種のものを実装するには、PULL 機能を独自のキューでラップする必要があります。停止するまで、メッセージを個人用キュー (別のスレッド内?) に「継続的に」PULL し、それらのメッセージを処理して終了します。

于 2012-09-12T18:58:29.493 に答える