使用ZeroMQ与死服务器时终止python脚本

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)

min*_*nrk 8

您正在遇到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)