【发布时间】:2012-08-19 21:17:11
【问题描述】:
我有一个应用程序使用 PyQt4 和 python-twisted 来保持与另一个程序的连接。我正在使用here 中的“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()
代码嵌套在整个Armory project files 中。 ArmoryQt.py(包含上述代码)和armoryengine.py(包含用于此连接的ReconnectingClientFactory 子类)。
因此,reactor.connectTCP() 调用立即执行。客户端代码执行发送命令,然后立即调用connectionLost()。它似乎没有尝试重新连接。除了connectionLost(),它也不会抛出任何错误。更神秘的是,它稍后会收到来自远程节点的消息,而这个应用程序甚至会处理它们!但它认为它没有连接(并且握手从未完成,因此远程节点不应该发送消息,但可能是该程序中的错误/疏忽)。
到底发生了什么!?反应堆怎么能在我告诉它启动之前启动呢?我搜索了代码,发现没有其他代码(我相信)可以启动反应堆。
【问题讨论】:
-
欢迎来到 Stack Overflow!如果您可以输入足够多的代码来重现问题(并删除所有无关的内容),那么人们更有可能帮助您。特别是,您应该尝试创建Short, Self-Contained, (Compilable) Correct Example?
-
谢谢杰夫。我通常很擅长这样做......除了这个问题在我曾经使用过的任何系统上都无法重现,所以我认为完整的代码示例不值得填写页面! (更不用说扭曲的客户端工厂类占用了大量空间)
-
说的有道理,看起来别人也懂,这才是最重要的。也不错的用户名:)