如何解决如何异步接收 ZeroMQ (pyzmq) JSON 消息?
现在我的代码中有以下结构。请求直接解析为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
解决了这个问题。 - 我想我也可以按照您的建议删除轮询,因为与套接字连接相关的所有内容都在其自己的线程中运行,因此不应阻塞整个程序
解决方法
代码中还发生了什么?
- 只有在没有可用的入站消息时程序还有其他事情要做,您才轮询超时时间为 0。当轮询返回指示没有准备好套接字时,让程序执行其他操作
- 如果您需要对 几个 套接字中的任何一个准备好读取做出反应,并且在队列中没有任何事情可做,您可以使用非零超时轮询多个套接字(请参阅 here)同时。
- 如果您只有一个套接字,并且您只是在做任何其他事情之前等待消息到达,只需调用
recv()
,它会阻塞直到消息出现。在这种情况下不需要进行轮询。
了解“poll”的字典定义是有帮助的,意思是“检查状态”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。