我有一个使用PyQt4和python-twisted的应用程序来维护与另一个程序的连接。我正在使用“qt4reactor.py”找到here。这都是使用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()
代码嵌套在Armory project files中。 ArmoryQt.py(包含上面的代码)和armoryengine.py(包含用于此连接的ReconnectingClientFactory
子类。)
因此,reactor.connectTCP()
调用立即执行。客户端代码执行send命令,然后立即调用connectionLost()
。它似乎没有尝试重新连接。除了connectionLost()
之外,它也不会抛出任何错误。更神秘的是,它稍后会从远程节点接收消息,这个应用程序甚至可以处理它们!但它认为它没有连接(并且握手永远不会完成,因此远程节点不应发送消息,但可能是该程序中的错误/疏忽)。
到底是怎么回事!?在我告诉它开始之前,反应堆怎么能开始?我搜索了代码,发现没有其他代码(我相信)可以启动反应堆。
答案 0 :(得分:0)
您正在寻找的API是twisted.internet.reactor.callWhenRunning。
但是,启动时计算时间不到60秒也不会有害。也许你应该把它传播出来,或者把它委托给一个线程,如果它相对独立的话?