簡體   English   中英

Python扭曲的反應堆啟動得太早

[英]Python-Twisted Reactor Starting too Early

我有一個使用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()

該代碼嵌套在整個Armory項目文件中 ArmoryQt.py(包含上面的代碼)和armeryengine.py(包含用於此連接的ReconnectingClientFactory子類)。

因此, reactor.connectTCP()調用將立即執行。 客戶端代碼執行send命令,然后立即調用connectionLost() 它似乎沒有嘗試重新連接。 除了connectionLost()之外,它也不會引發任何其他錯誤。 更神秘的是,它稍后會接收到來自遠程節點的消息,而該應用程序甚至會處理它們! 但是它認為它沒有連接(並且握手從未完成,因此遠程節點應該發送消息,而可能是該程序中的錯誤/疏忽)。

到底是怎么回事!? 在我告訴反應堆啟動之前,反應堆如何啟動? 我搜索了代碼,發現(我相信)沒有其他代碼可以啟動反應堆。

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

但是,啟動時少於60秒的計算也不會造成損害:)。 如果它是相對獨立的,也許您應該將其分發出去,或將其委托給線程?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM