如何异步接收 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 的问题):
- 在此期间,我的程序还有其他事情要做。这确实导致了一些其他问题,我已经通过将超时设置为
None
. 来解决这个问题
- 我假设我也可以按照您的建议删除轮询,因为与套接字连接相关的所有内容都在其自己的线程中运行,因此不应阻止整个程序
代码中还发生了什么?
- 只有在没有可用的入站消息时程序还有其他事情要做时,您才使用超时 0 进行轮询。当轮询 returns 指示没有套接字准备就绪时,让程序去做其他事情
- 如果您需要对几个套接字中的任何一个准备好读取做出反应,您可以使用非零超时轮询多个套接字(参见here),并且有在此期间无事可做。
- 如果您只有一个套接字,并且您只是在等待消息到达再做任何其他事情,只需调用
recv()
,它将阻塞直到消息出现。在这种情况下不需要轮询。
了解“投票”的字典定义很有帮助,意思是“检查……的状态”。
现在我的代码中有以下结构。请求直接解析为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 的问题):
- 在此期间,我的程序还有其他事情要做。这确实导致了一些其他问题,我已经通过将超时设置为
None
. 来解决这个问题
- 我假设我也可以按照您的建议删除轮询,因为与套接字连接相关的所有内容都在其自己的线程中运行,因此不应阻止整个程序
代码中还发生了什么?
- 只有在没有可用的入站消息时程序还有其他事情要做时,您才使用超时 0 进行轮询。当轮询 returns 指示没有套接字准备就绪时,让程序去做其他事情
- 如果您需要对几个套接字中的任何一个准备好读取做出反应,您可以使用非零超时轮询多个套接字(参见here),并且有在此期间无事可做。
- 如果您只有一个套接字,并且您只是在等待消息到达再做任何其他事情,只需调用
recv()
,它将阻塞直到消息出现。在这种情况下不需要轮询。
了解“投票”的字典定义很有帮助,意思是“检查……的状态”。