如何异步接收 ZeroMQ (pyzmq) JSON 消息?

How can I receive a ZeroMQ (pyzmq) JSON message asynchronously?

现在我的代码中有以下结构。请求直接解析为JSON.

while True:
   if self.rest_sock.poll(timeout=0):
      request = self.rest_sock.recv_json()
      ...

我想用函数的异步调用替换循环(以减少 CPU 时间,如此处解释:). This is done by registering a function as an event handler by using on_recv(). But the JSON message is not parsed. I assume I could parse it myself as explained e.g. here 。但我想知道为什么没有等同于 socket.recv_json() 用于异步接收 json 消息,例如 on_recv_json().

编辑(回答来自@bazza 的问题):

代码中还发生了什么?

  • 只有在没有可用的入站消息时程序还有其他事情要做时,您才使用超时 0 进行轮询。当轮询 returns 指示没有套接字准备就绪时,让程序去做其他事情
  • 如果您需要对几个套接字中的任何一个准备好读取做出反应,您可以使用非零超时轮询多个套接字(参见here),并且有在此期间无事可做。
  • 如果您只有一个套接字,并且您只是在等待消息到达再做任何其他事情,只需调用 recv(),它将阻塞直到消息出现。在这种情况下不需要轮询。

了解“投票”的字典定义很有帮助,意思是“检查……的状态”。