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)
我有一个简单的 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 raisesZMQError
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)