我在使用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实现了一个简单的请求 - 回复架构和路由器.这适用于PyZMQ版本2.1.11.不幸的是,当我在PyZMQ版本14.0.0上测试它时,发送方(REQ)可以发送到路由器然后路由器收到它的消息并发送到接收方(REP)但接收方没有收到消息!当我将PyZMQ从2.1.11升级到14.0.0时,我遇到了这个问题.
REQ < - > ROUTER < - > REP
这是我的代码:
sender.py
import zmq
import time
if __name__=='__main__':
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.setsockopt(zmq.IDENTITY, "S")
socket.connect("tcp://127.0.0.1:6660")
i = 0
while True:
i += 1
socket.send("R", zmq.SNDMORE)
socket.send("", zmq.SNDMORE)
socket.send("Message: %d" % i)
print("Message : %d sent" % i)
fromAddr = socket.recv()
empty = socket.recv()
resp = socket.recv()
print("%s received!" % str(resp))
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
router.py
import zmq
import time
if __name__=='__main__':
context = zmq.Context()
frontend …Run Code Online (Sandbox Code Playgroud)