1

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()。さらに不思議なことに、後でリモートノードからメッセージを受信し、このアプリはそれらを処理します! しかし、それは接続されていないと考えています (そしてハンドシェイクが終了していないため、リモートノードはメッセージを送信するべきではありませんが、そのプログラムのバグ/見落としである可能性があります)。

いったい何が起きているの!? 原子炉は、起動するように指示する前に、どのように起動できますか? コードを検索したところ、原子炉を起動できる (と私が信じている) 他のコードは見つかりませんでした。

4

1 に答える 1

0

探している API はtwisted.internet.reactor.callWhenRunningです。

ただし、起動時の計算時間が 60 秒未満であっても問題ありません:)。比較的独立している場合は、おそらくそれを分散させるか、スレッドに委任する必要がありますか?

于 2012-08-20T00:07:28.693 に答える