PyQt4 と python-twisted を使用して別のプログラムへの接続を維持するアプリケーションがあります。hereにある「qt4reactor.py」を使用しています。これはすべてpy2exeを使用してパッケージ化されています。このアプリケーションは 99% のユーザーで問題なく動作しますが、あるユーザーは、自分の Windows システムでネットワークが完全に機能していないと報告しています。他のユーザーはこの問題を報告しておらず、自分の Windows VM でそれを複製することはできません。ユーザーは異常な構成を報告しません。
デバッグ ログは、reactor がまだ開始されていないにもかかわらず、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 (上記のコードを含む) および Armoryengine.py (ReconnectingClientFactory
この接続に使用されるサブクラスを含む)。
したがって、reactor.connectTCP()
呼び出しはすぐに実行されます。クライアント コードは send コマンドを実行し、すぐconnectionLost()
に呼び出されます。再接続を試みているようには見えません。以外のエラーもスローしませんconnectionLost()
。さらに不思議なことに、後でリモートノードからメッセージを受信し、このアプリはそれらを処理します! しかし、それは接続されていないと考えています (そしてハンドシェイクが終了していないため、リモートノードはメッセージを送信するべきではありませんが、そのプログラムのバグ/見落としである可能性があります)。
いったい何が起きているの!? 原子炉は、起動するように指示する前に、どのように起動できますか? コードを検索したところ、原子炉を起動できる (と私が信じている) 他のコードは見つかりませんでした。