我有一个应用程序使用 PyQt4 和 python-twisted 来保持与另一个程序的连接。我正在使用此处找到的“qt4reactor.py” 。这都是使用 py2exe 打包的。该应用程序对 99% 的用户都运行良好,但一位用户报告说,他的 Windows 系统上的网络完全失败。没有其他用户报告此问题,我无法在我自己的 Windows VM 上复制它。用户报告无异常配置。
调试日志显示reactor.connectTCP()
调用正在立即执行,即使反应器尚未启动!没有错误的运行顺序,因为这是一个单线程进程,计算时间为 60 秒,并且在这条线和反应器应该启动的时间之间有多个日志消息。
代码很多,所以我只放伪代码,希望有一个通用的解决方案。我将链接到它下面的实际代码。
import qt4reactor
qt4reactor.install()
# Start setting up main window
# ...
from twisted.internet import reactor
# Separate listener for detecting/processing multiple instances
self.InstanceListener = ListenerFactory(...)
reactor.listenTCP(LISTEN_PORT, self.InstanceListener)
# The active/main connection
self.NetworkingFactory = ClientFactory(...)
reactor.connectTCP(ACTIVE_IP, ACTIVE_PORT, self.NetworkingFactory)
# Finish setting up main window
# ...
from twisted.internet import reactor
reactor.runReturn()
代码嵌套在整个军械库项目文件中。ArmoryQt.py(包含上述代码)和armoryengine.py(包含ReconnectingClientFactory
用于此连接的子类)。
因此,reactor.connectTCP()
调用立即执行。客户端代码执行发送命令,然后立即connectionLost()
被调用。它似乎没有尝试重新连接。它也不会抛出除connectionLost()
. 更神秘的是,它稍后会收到来自远程节点的消息,而这个应用程序甚至会处理它们!但它认为它没有连接(并且握手从未完成,因此远程节点不应该发送消息,但可能是该程序中的错误/疏忽)。
到底是怎么回事!?反应堆怎么能在我告诉它启动之前启动呢?我搜索了代码,发现没有其他代码(我相信)可以启动反应堆。