我在从ZMQ套接字接收消息时遇到问题。我创建了一个套接字,将其绑定到一个地址并设置其订阅。但是,当我尝试从套接字接收消息时,程序挂起。
self.context = zmq.Context()
self.pub_socket = self.context.socket(zmq.SUB)
self.pub_socket.connect(pub_socket_addr)
self.pub_socket.setsockopt(zmq.SUBSCRIBE, value)
reply = self.pub_socket.recv()
我们尝试使用NOBLOCK标志在无限循环中捕获ZMQError,如下面的代码所示,但它也不会从服务器接收任何数据。
while True:
try:
reply = self.pub_socket.recv(zmq.NOBLOCK)
try:
if(json.loads(reply)[command.Command.COMM_TYPE] == command.Command.GAME_START):
return True
except ValueError:
continue
except zmq.ZMQError:
break
可能出现什么问题?
答案 0 :(得分:0)
您的第一个代码段会挂起,因为recv()
仅在收到后才会返回。
无限循环是break
第一次迭代,因为zmq.ZMQError
异常上升,因为没有任何东西可以接收。您可以尝试将break
指令替换为time.sleep(0.1)
以进行迭代,直到套接字收到某些内容且GAMESTART
条件满足为止。
以下代码可以解决这个问题:
got_game_start = False
while not got_game_start:
try:
reply = self.pub_socket.recv(zmq.NOBLOCK)
except zmq.ZMQError:
time.sleep(0.1)
else:
try:
got_game_start = (json.loads(reply)[command.Command.COMM_TYPE] == command.Command.GAME_START)
except:
got_game_start = False
# at this point the loop should end after receiving the game start message