ZMQ connect and push——如何判断是否失败

ZMQ connect and push - how to determine if it fails

我有一个简单的 ZMQ 程序,它建立一个 zmq.PUSH 套接字,connects,然后尝试发送消息。

import zmq

zcontext = zmq.Context()
zsock = zcontext.socket(zmq.PUSH)
zsock.connect("tcp://localhost:12345")

with open(sys.argv[1]) as f:
   for line in f:
       zsock.send(line)

当对方在的时候,这很好用。但是如果另一端的监听器有任何问题(例如忘记启动监听器,或者我连接到错误的端口),它会在尝试发送大约 1000 条消息后挂起(取决于默认队列的大小)。

正确的做法是什么?如果另一方有任何问题,我宁愿打印一条错误消息并优雅地退出。

您可以通过以下代码片段获得zmq.error

import zmq
import time

zcontext = zmq.Context()
zsock = zcontext.socket(zmq.PUSH)
zsock.connect("tcp://localhost:12345")

try:
    with open(sys.argv[1]) as f:
        for line in f:
            zsock.send(line, flags=NOBLOCK)
            time.sleep(.1)

except zmq.ZMQError as exc:
    print(exc)

[注意]:

  • 可以把上面代码中的.connect()方法改成.bind(),另外把另一边的bind改成connect就可以了测试用例.

  • .bind()方法中应该使用127.0.0.1而不是localhost


[更新]:

  • 检查 Limiting_ZeroMQ_Queue
  • With flags=NOBLOCK in .send() method, this raises ZMQError if the queue is full; otherwise, this waits until space is available. Thus, in this case, will be as the following:

    zsock.send(line, flags=NOBLOCK)