GHH*_*HHT 7 python termination zeromq pyzmq
我在使用ZeroMQ时关闭python应用程序时遇到问题.首先我连接到未运行的服务器!
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket_id = randomID()
socket.setsockopt(zmq.IDENTITY, socket_id)
socket.connect("tcp://dead_server")
poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)
Run Code Online (Sandbox Code Playgroud)
并发送我的消息
socket.send(msg)
Run Code Online (Sandbox Code Playgroud)
等待回复
sockets = dict(poller.poll(1000))
if sockets.get(socket) == zmq.POLLIN:
result = socket.recv()
print (result)
Run Code Online (Sandbox Code Playgroud)
所以服务器已经死了,消息将不会发送,也没有回复.这是真的.然后我关闭套接字并从poller取消注册然后使用新套接字连接到活动服务器,我通过套接字发送消息并从中获取回复.
poller.unregister(socket)
socket.close()
socket = context.socket(zmq.REQ)
socket.setsockopt(zmq.IDENTITY, socket_id)
poller.register(socket, zmq.POLLIN)
socket.connect("tcp://alive_server")
socket.send(msg)
sockets = dict(poller.poll(1000))
if sockets.get(socket) == zmq.POLLIN:
result = socket.recv()
print (result)
# Every thing ok up to hear
Run Code Online (Sandbox Code Playgroud)
之后应用程序(python脚本)没有关闭(终止)!这是我的问题.[我可以关闭应用程序,sig_term但我不会出于某种原因使用它.]如果我不向死服务器发送第一条消息,应用程序将真正关闭.我想问题是ZeroMQ io线程,但我无法解决它.
exit(0) # Not worked
sys.exit(0) # Not worked
Run Code Online (Sandbox Code Playgroud)
您正在遇到ZeroMQ的LINGER行为.LINGER定义了在允许Context.term丢弃消息之前Context应该等待多长时间.ZeroMQ 2.x中的默认值是永久的,ZeroMQ 3.x中的默认值是一秒.如果你告诉你的套接字他们应该只停留很短的时间,你的脚本应该退出正常:
socket = context.socket(zmq.REQ)
socket_id = randomID()
socket.identity = ramdomID()
socket.linger = 250 # 250ms = 1/4 s
socket.connect("tcp://dead_server")
Run Code Online (Sandbox Code Playgroud)