Python ZMQ连接和推送-如何确定是否失败
我有一个简单的Python ZMQ连接和推送-如何确定是否失败,python,zeromq,pyzmq,Python,Zeromq,Pyzmq,我有一个简单的ZMQ程序,它建立一个ZMQ.PUSH套接字,连接,然后尝试发送消息 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) 当另一面在那里时,这种方法可以很好地工作。但是,如
ZMQ
程序,它建立一个ZMQ.PUSH
套接字,连接,然后尝试发送消息
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)
[注意]:
- 您可以使用上述代码中的
.bind()
更改.connect()
方法,还可以将测试用例的另一端bind
更改为connect
- 在
.bind()
中,应使用127.0.0.1
方法,而不是localhost
[更新]:
- 检查
- 使用
.send()
方法中的flags=NOBLOCK
,如果队列已满,则会引发ZMQError
否则,将等待空间可用。
因此,在这种情况下,将如下所示:
zsock.send(行,标志=NOBLOCK)
我认为那不管用。你试过了吗?它只是试着把它送下插座而不抛出异常为什么不工作?!如果你在这个循环中有错误,你会知道的。我试过了。选择了一个没有人监听的随机端口。它不会抛出异常直到1000次循环后被挂起?是的。我认为1000可能是默认的队列大小。它上升到1000,然后挂起。您是否尝试过使用flags=NOBLOCK
?