私は今週ZeroMQを使い始めましたが、Request-Responseパターンを使用するときに、メッセージをドロップしたり、そのメッセージを送信した顧客にメッセージを送信させたりせずに、ワーカーが安全に「電話を切って」ソケットを閉じる方法がわかりません。応答。次のようなPythonで記述されたワーカーを想像してみてください。
import zmq
c = zmq.Context()
s = c.socket(zmq.REP)
s.connect('tcp://127.0.0.1:9999')
while i in range(8):
s.recv()
s.send('reply')
s.close()
私は実験を行ってきましたが、均等化キューイングのリクエストを行う127.0.0.1:9999
ソケットタイプの顧客zmq.REQ
は、均等化キューイングアルゴリズムが最後の作業を行った直後で、send()
実行される前に上記のワーカーを選択するという不幸を抱えている可能性があることがわかりました。次のclose()
方法。その場合、要求はワーカープロセスのØMQスタックによって受信およびバッファリングされclose()
、ソケットに関連付けられているすべてのものを破棄すると要求は失われるようです。
ワーカーが「安全に」切り離すにはどうすればよいですか。「メッセージはもう必要ありません」というシグナルを送信し、(a)シグナルの送信中に到着した最終メッセージをループし、(b)応答を生成する方法はありますか。次に(c)close()
メッセージが破棄されないことを保証して実行しますか?
編集:私が入りたい生の状態は「ハーフクローズ」状態であり、それ以上のリクエストを受信することはできず、送信者はそれを知っていると思いますが、チェックできるようにリターンパスはまだ開いています最後に到着した1つのメッセージの着信バッファーで、バッファー内にメッセージが存在する場合はそれに応答します。
編集:良い質問に答えて、応答を待機している接続が多数ある可能性があるため、待機中のメッセージの数が複数になるように説明を修正しました。