4

PUSHer と複数の PULLer で構成される ZeroMQ ネットワークがあります。問題は、puller の数が不明であり、場合によっては 0 になる可能性があることです。後者が発生した場合、socket.send(msg) は返されないようです。私の記憶が確かなら、これは PUB/SUB ソケットでは起こりません。

パイプの反対側に引き手がない場合に、パケットを押し込まないようにする方法はありますか?

ありがとう!

4

2 に答える 2

8

いくつかの方法でブロックを回避できます。

  • zmq_poll を使用して、PUSH ソケットが出力の準備ができていることを確認し、準備ができている場合にのみ送信します。
  • ノンブロッキング送信を使用する (zmq_msg_send メソッドの ZMQ_DONTWAIT)
  • ソケットで送信タイムアウトをゼロに設定し (ZMQ_SNDTIMEO ソケット オプション)、送信がタイムアウトしたときのエラー リターンを処理します。
  • ROUTER-DEALER などの別のソケット パターンを使用して、クライアントからサーバーへのより明示的なシグナリングを行う
于 2012-11-29T04:55:15.880 に答える
4

簡単な答え: PUSH/PULL と PUB/SUB のセマンティクスは異なります。

PUSH/PULL は、プッシュされたメッセージをプーラー間で分配します。ファンアウトしたいときにこれを使用し、処理が確実に行われるようにします。誰も聞いていない場合は、ブロックされます。

PUB/SUB は、発行されたメッセージをすべてのサブスクライバーにブロードキャストします。誰も聞いていない場合、メッセージは失われます。

あなたのユースケースには PUB/SUB の方が適しているように思えます。メッセージが失われるファンアウトは、結局のところ意味がありません。

于 2012-11-28T23:59:21.823 に答える