【问题标题】:Python-Twisted Reactor Starting too EarlyPython-Twisted Reactor 启动得太早
【发布时间】: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?
  • 谢谢杰夫。我通常很擅长这样做......除了这个问题在我曾经使用过的任何系统上都无法重现,所以我认为完整的代码示例不值得填写页面! (更不用说扭曲的客户端工厂类占用了大量空间)
  • 说的有道理,看起来别人也懂,这才是最重要的。也不错的用户名:)

标签: python twisted


【解决方案1】:

您要查找的 API 是 twisted.internet.reactor.callWhenRunning

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

【讨论】:

  • 我认为所有呼叫都排队等待在运行时调用...?那么我应该用reactor.callWhenRunning(reactor.connectTCP,IP,PORT,FACTORY)替换connectTCP(IP,PORT,FACTORY)吗? 60 秒的加载时间是不幸的,但它带来了用户喜欢的好处。这是由于必须从磁盘读取和处理 2.5 GB 的数据。现在,我实际上正在尝试将其线程化到后台。但我认为这不会对这个问题产生很大影响。
  • 不。其中许多调用是立即调用的,因此(例如)可以知道正在侦听的侦听套接字。
  • 那么,为什么在我运行它的其他 99% 的系统上,它的工作方式与我预期的一样?它“调用”connectTCP(),进行一些其他处理,然后在反应器启动时实际执行连接。这似乎不一致。
  • 我不知道这台电脑有什么不寻常之处。听队列深度,也许?你的服务负载了吗?
猜你喜欢
  • 2011-07-01
  • 2021-06-04
  • 2015-01-22
  • 2022-01-12
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多