8

たとえば、あるアプリケーションがfrom twisted.internet import reactorを行い、別のアプリケーションが同じことを行う場合、それらreactorsは同じですか?

ツイストを使用するアプリケーションであるDelugeは、リアクターを使用して UI (gtk) をツイストによって駆動されるアプリケーションの残りの部分に接続しているように見えるため、質問しています (ソースを理解しようとしています)。たとえば、UI を閉じると、単に が呼び出されますreactor.stop()

それだけですか?私には魔法のように思えます。twisted を使用する別のアプリケーションを実行したい場合はどうすればよいですか?

4

2 に答える 2

14

はい、Python のすべてのモジュールは常にグローバルです。または、より適切に言えば、シングルトンです。そうするとfrom twisted.internet import reactor、Python のインポート メカニズムは最初に をチェックsys.modules['twisted.internet.reactor']し、存在する場合はその値を返します。存在しない場合 (つまり、モジュールが初めてインポートされたとき) にのみ、モジュールが実際に初めてロードされます (sys.modules将来のインポートの可能性のためにエントリに隠されます)。

Singleton 設計パターンには特に魔法のようなものはありませんが、アーキテクチャが「1 つしか存在できない」と宣言したものを複数必要とする場合、制限が生じることがあります。Twisted のドキュメントは次のことを認めています。

新しいアプリケーション コードは、参照を取得するためにこのモジュールをインポートできることに依存するのではなく、reactor を必要に応じてパラメーターとして受け渡しすることを優先する必要があります。これにより、単体テストが簡素化され、(パフォーマンスの向上として) 複数のリアクターのサポートが容易になる可能性がありますが、現時点ではこれは不可能です。

それを可能にする最善の方法は、それがあなたのアプリにとって重要である場合、ツイスト プロジェクトに貢献することです。労力 (1 つのアプリ内で複数のリアクター、つまり複数のイベント ループをサポートするために必要な微妙なメカニズムのコーディング) または資金のいずれかです。 (お金があれば、この仕事をするために、誰かを奨学金で支えることができます)。

それ以外の場合は、別々のプロセスを (multiprocessing標準ライブラリのモジュールなどで) 使用し、それぞれに複数のリアクターを使用しないでください。

于 2010-08-06T14:43:32.297 に答える
2

原子炉は確かにグローバルです。イベントループを処理し、イベントを消費するハンドラーを登録します。同じreactorで複数のアプリケーションを使用する場合は、twistedデーモンを使用できます。http://twistedmatrix.com/documents/current/core/howto/application.html

于 2010-08-06T14:50:45.023 に答える