1

我有一个应用程序使用 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(). 更神秘的是,它稍后会收到来自远程节点的消息,而这个应用程序甚至会处理它们!但它认为它没有连接(并且握手从未完成,因此远程节点应该发送消息,但可能是该程序中的错误/疏忽)。

到底是怎么回事!?反应堆怎么能在我告诉它启动之前启动呢?我搜索了代码,发现没有其他代码(我相信)可以启动反应堆。

4

1 回答 1

0

您正在寻找的 API 是twisted.internet.reactor.callWhenRunning

但是,启动时的计算时间少于 60 秒也没有什么坏处:)。如果它是相对独立的,也许你应该把它分散开,或者将它委托给一个线程?

于 2012-08-20T00:07:28.693 回答