WeChatFerry
WeChatFerry copied to clipboard
Fix NNGException when msg port is not ready yet
- 代码位置 clients/python/wcferry/client.py:enable_receiving_msg
- 问题 在连接消息端口时,有概率出现消息端口还没有启动监听,导致GetMessage线程出现异常: pynng.exceptions.NNGException: Connection shutdown
- 解决方案 增加循环sleep等待
感谢 PR!把连接放到线程外有好处,不过:
- 当出现 Exception 时,靠重试是解决不了问题的;(没启动监听这情况理论上不存在。这是同步的,发指令先启动了,再设置相应参数,然后指令响应返回,才开始去连接)
- 退一步说,真有可能出现异常,也应该由
enable_receiving_msg的使用者来自行处理(再次调用、重启电脑……),它自己无法处理好。
这里应该由消息消费者自行处理
感谢 PR!把连接放到线程外有好处,不过:
1. 当出现 Exception 时,靠重试是解决不了问题的;(没启动监听这情况理论上不存在。这是同步的,发指令先启动了,再设置相应参数,然后指令响应返回,才开始去连接) 2. 退一步说,真有可能出现异常,也应该由 `enable_receiving_msg` 的使用者来自行处理(再次调用、重启电脑……),它自己无法处理好。
感谢回复,关于您说的问题:
- 理论上确实不应该出现,但我这边也确实遇到了 :-( 。抛出pynng.exceptions.NNGException的概率超过95%。但只要sleep 0.1秒就总是可以连上了。也许是我的服务器CPU性能比较差;
- 此前试过再次调用enable_receiving_msg。但因为self._is_receiving_msg is True,而不会再次启动GetMessage线程。而且因为无法捕获线程中的异常,所以无法外部处理连接失败的情况;
又想了想,是可以通过有点hack的方式解决。比如从wcf.msg_socket获取连接状态,再修改wcf._is_receiving_msg,让enable_receiving_msg可以再次重试 :-)
又试了下,发送指令后到连接成功之间,需要sleep 0.004~0.006秒。性能确实不太理想,but it work
出现相同问题,几乎每次启动都会报错NNGException,使用了PR中的方法修复后可以解决