WeChatFerry icon indicating copy to clipboard operation
WeChatFerry copied to clipboard

Fix NNGException when msg port is not ready yet

Open Saroth opened this issue 1 year ago • 4 comments

  • 代码位置 clients/python/wcferry/client.py:enable_receiving_msg
  • 问题 在连接消息端口时,有概率出现消息端口还没有启动监听,导致GetMessage线程出现异常: pynng.exceptions.NNGException: Connection shutdown
  • 解决方案 增加循环sleep等待

Saroth avatar Mar 09 '24 12:03 Saroth

感谢 PR!把连接放到线程外有好处,不过:

  1. 当出现 Exception 时,靠重试是解决不了问题的;(没启动监听这情况理论上不存在。这是同步的,发指令先启动了,再设置相应参数,然后指令响应返回,才开始去连接)
  2. 退一步说,真有可能出现异常,也应该由 enable_receiving_msg 的使用者来自行处理(再次调用、重启电脑……),它自己无法处理好。

lich0821 avatar Mar 09 '24 14:03 lich0821

这里应该由消息消费者自行处理

rehiy avatar Mar 09 '24 14:03 rehiy

感谢 PR!把连接放到线程外有好处,不过:

1. 当出现 Exception 时,靠重试是解决不了问题的;(没启动监听这情况理论上不存在。这是同步的,发指令先启动了,再设置相应参数,然后指令响应返回,才开始去连接)

2. 退一步说,真有可能出现异常,也应该由 `enable_receiving_msg` 的使用者来自行处理(再次调用、重启电脑……),它自己无法处理好。

感谢回复,关于您说的问题:

  1. 理论上确实不应该出现,但我这边也确实遇到了 :-( 。抛出pynng.exceptions.NNGException的概率超过95%。但只要sleep 0.1秒就总是可以连上了。也许是我的服务器CPU性能比较差;
  2. 此前试过再次调用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

Saroth avatar Mar 10 '24 00:03 Saroth

出现相同问题,几乎每次启动都会报错NNGException,使用了PR中的方法修复后可以解决

Ca11back avatar Sep 07 '24 09:09 Ca11back