我有一个简单的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条消息后挂起(取决于默认队列的大小)。>
正确的做法是什么?如果另一端有任何问题,我宁愿只打印一条错误消息并正常退出。
答案 0 :(得分:1)
您可以使用以下代码段获取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
以用于测试用例。< / p>
在.bind()
中应使用127.0.0.1
而不是localhost
。
[更新]:
使用
flags=NOBLOCK
方法中的.send()
,如果队列已满,则会引发ZMQError
;否则,它将等待直到可用空间。 因此,在这种情况下,将如下所示:
zsock.send(line, flags=NOBLOCK)