【发布时间】:2021-09-24 03:18:50
【问题描述】:
现在我的代码中有以下结构。请求直接解析为 JSON。
while True:
if self.rest_sock.poll(timeout=0):
request = self.rest_sock.recv_json()
...
我想用函数的异步调用来替换循环(以减少 CPU 时间,如下所述:https://stackoverflow.com/a/21937311/10555800)。这是通过使用on_recv() 将函数注册为事件处理程序来完成的。但是 JSON 消息没有被解析。我假设我可以自己解析它,例如解释这里https://stackoverflow.com/a/34242555/10555800。但我想知道为什么没有与 socket.recv_json() 等效的东西来异步接收像 on_recv_json() 这样的 json 消息。
编辑(回答@bazza 的问题):
- 与此同时,我的程序还有其他事情要做。这确实导致了一些其他问题,我已经通过将超时设置为
None解决了这个问题。 - 我想我也可以按照您的建议删除投票,因为与套接字连接相关的所有内容都在其自己的线程中运行,因此不应阻塞整个程序
【问题讨论】:
-
所以,我想我们又回到了您已经掌握的代码 sn-p 上。如果没有就绪消息,则超时为零的轮询立即返回,并且脚本继续执行其他操作。如果这不是太长并且本质上是循环的(
while循环),您很快就会回到投票中。如果这表明一条消息现在已经准备好了,那么这个线程中唯一可能发生的事情就是 JSON 解析,因为 ZMQ 自己的线程已经处理了跨网络的消息读取。 -
或者,完全摆脱轮询,并调用套接字接收传递适当的标志以实现非阻塞。
标签: python asynchronous zeromq pyzmq