我有一个使用ZMQ REQ / REP套接字的程序来检查特定模块是否在主机上运行。
想要的行为是,如果我从模块中得到答案,我会做东西,如果不是(即,如果指定端口上没有ZMQ REQ套接字),那么我希望程序返回。
对于错误情况,我希望得到一个zmq.error.Again
异常,我可以对此做出反应。
我的简化方法如下:
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.setsockopt(zmq.RCVTIMEO, 1000)
socket.setsockopt(zmq.SNDTIMEO, 1000)
try:
socket.connect ("tcp://localhost:5104")
socket.send_string("hello")
message = socket.recv(zmq.NOBLOCK)
except Exception as e:
print('Exception occured: ',e)
socket.close()
在IPython中,如果没有答案,代码将按预期工作,它将引发异常并返回。如果我从命令行调用此代码,但是它确实引发异常,请执行打印,但此后不返回-cmd窗口将在打印后停留,并且光标闪烁。
如果我注释掉socket.send_string
和socket.recv
,通常也会在命令行中返回。
有什么想法为什么IPython和从命令行调用会给出不同的行为?
我的系统详细信息:
Windows 7
Anaconda 3
python 3.6.7
zeromq 4.2.5
[更新]
我找到了答案,为什么它不返回here。基本上,ZMQ试图关闭从未打开过的套接字。可以通过将LINGER
选项设置为True
来更改此行为:
socket.setsockopt(zmq.LINGER, True)
但是我仍然不明白为什么IPython返回...