2012-01-27 15 views
4

私はZeroMQを混乱させるばかりで、通常終了しないクライアントには問題があります。特に私はシンクサーバーがリッスンしていないときにデータを "プッシュ"する可能性のあるクライアントを持っていて、これはPythonコードの終了後にプロセスがハングアップするようです。私は、クリーンアップする必要があるいくつかのバックグラウンドスレッドがあると仮定します - どのように、またはドキュメントを指してください教えてください。ZeroMQプッシュソケットは、プロセスがリッスンしていないときにクライアントが終了しないようにします。

ここに関連するコードがあります。私は「self.push」行でなしリスナーでプロセスを実行する場合、プロセスが正常に完了したプロセスがラインコメント(およびリスナーがありません)で

def setup(self): 
    print self.name, "connect to sockets" 
    ctx = self.ctx = zmq.Context() 
    self.pull = ctx.socket(zmq.PULL) 
    self.pull.connect(self.ventillatorAddress) 
    self.push = ctx.socket(zmq.PUSH) 
    self.push.connect(self.sinkAddress) 
    self.control = ctx.socket(zmq.SUB) 
    self.control.connect(self.publisherAddress) 
    self.control.setsockopt(zmq.SUBSCRIBE, "") # get every control message 
    self.inbox = ctx.socket(zmq.SUB) 
    self.inbox.connect(self.distributorAddress) 
    self.inbox.setsockopt(zmq.SUBSCRIBE, self.name) # listen only for messages addressed with name 
def start(self): 
    print self.name, "push worker is ready signal" 
    # listen for "go" signal 
    pollcount = 0 
    go = False 
    while not go: 
     #print "send ready for", self.name 
     #self.push.send(self.name+" ready") 
     print "listen for 'go'" 
     msg = self.recvPoll(self.control) 
     if msg is None: 
      pollcount += 1 
      assert pollcount<10 
      print "poll timeout", pollcount 
      time.sleep(1) 
      continue 
     pollcount = 0 
     print "recv'd", msg 
     assert msg=="go!" 
     go = True 
    print "go signal received" 
    pass 

をハングコメント解除。 私はcontext.term()とcontext.destroy()を試してみましたが、彼らは役に立たないようです。

ソケットをクリーンアップするにはどうすればよいですか?それとも他の手がかり?前もって感謝します!

答えて

4

これはおそらく、リンガーのZeroMQの機能が原因です。 man page

ZMQ_LINGERオプションは、指定したソケットの残存期間を設定するものとします。ソケットがzmq_close(3)で閉じられた後、ピアにまだ送信されていないペンディングメッセージがメモリに残り、zmq_term(3)でソケットのコンテキストの終了にさらに影響を及ぼすかどうかが、リンガー期間によって決まります。

既定値では、ZeroMQがスタックメッセージを配信できるまで無期限に待機します。

ZMQ_LINGERソケットオプションをゼロまたは短時間(ミリ秒単位)に設定してみてください。

+1

self.push.setsockopt(zmq.LINGER、100)Thanks1 –

関連する問題