【问题标题】:ZeroMQ push socket causes client to not terminate when no process is listeningZeroMQ 推送套接字导致客户端在没有进程正在侦听时不会终止
【发布时间】:2012-01-27 21:17:32
【问题描述】:

我刚开始搞乱 ZeroMQ,我遇到了一个不能正常终止的客户端问题。特别是我有一个客户端,当没有接收器服务器正在侦听时,它可能会“推送”数据,这似乎会使进程在 python 代码完成后挂起。我假设有一些后台线程需要清理——请告诉我如何或指向文档。

这是相关的代码。如果我在未注释“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() ,但它们似乎没有帮助。

如何清理套接字?还是有其他线索?提前致谢!

【问题讨论】:

    标签: python zeromq


    【解决方案1】:

    这很可能是由于 ZeroMQ 的 linger 功能。引用自man page

    ZMQ_LINGER 选项应设置指定套接字的延迟时间。逗留期决定了在使用 zmq_close(3) 关闭套接字后,尚未发送到对等方的未决消息应在内存中逗留多长时间,并进一步影响使用 zmq_term(3) 终止套接字上下文。

    默认值会导致 ZeroMQ 无限期地等待,直到它能够传递卡住的消息。

    尝试将ZMQ_LINGER 套接字选项设置为零或较短的时间(以毫秒为单位)。

    【讨论】:

    • self.push.setsockopt(zmq.LINGER, 100) 谢谢1
    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多