如何停止无限期等待发布套接字的ZMQ recv函数?

时间:2016-01-07 07:08:36

标签: python-2.7 sockets pyzmq

我在从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

可能出现什么问题?

1 个答案:

答案 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