Python-Twisted Reactor起步太早

时间:2012-08-19 21:17:12

标签: python twisted

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

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

1 个答案:

答案 0 :(得分:0)

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

但是,启动时计算时间不到60秒也不会有害。也许你应该把它传播出来,或者把它委托给一个线程,如果它相对独立的话?