6

タイトルが曖昧で申し訳ありませんが、これ以上のことはわかりませんでした。

ねじれた原子炉の現在の状態を取得する方法はありますか?ステータスとは、次のことを意味します。

  • ポートのリスナー
  • 接続されたプロトコル
  • 解雇を待っている延期
  • 実行中のLoopingCalls
  • 「アイドル」であるスレッド
  • およびその他の「アクティブな」もの...

基本的に、私は原子炉がただぼんやりと座っているかどうかを把握しようとしています。スタックオーバーフローを完全にするために、質問自体は私が実際に行う必要があることよりも広いです。

今、私の現在の状況は次のとおりです。

この人のスクリプトによって選択された多くの「動的」ポートをリッスンする他の人のスクリプトを使用しているため、スクリプトを使用してlistenTCPやTCP4ServerEndpointなどを実行し、そのステータスを確認することはできません。これは、使用するたびに各リスニングポートが破棄される非PASVFTPにいくぶん似ています。もう1つの問題は、私自身の小さなプログラムも同じプロセスで実行されていることです。これを引数として使用して、彼のプログラムを開始します。それは基本的に彼のプログラムへのインターフェースです。彼のすべてのことが完了し、私のことも完了したら、原子炉をシャットダウンしたいと思います。したがって、私はいつ原子炉を止めることができるかを理解しようとしています。シャットダウンするための私の正確な条件は次のとおりです。

  • 1つのポートでのみリッスンし、他のポートではリッスンしません。
  • 起動するdeferedまたはloopingCallsはありません。

検索しましたが、「ifreactor.running」や「ねじれたリアクターを停止する条件」などが見つかりました。これはフラグを使用して追跡する必要があります。私はむしろ彼のコードに触れたくない。それがねじれに寄与する可能性があるものであれば、私はむしろそれをしたいと思います。しかし、すでに代替案があるのであれば、私は車輪の再発明をしたくありません。

これらの条件をスクリプトに通知するために、彼のスクリプトを変更する必要がありますか?

4

1 に答える 1

3

Deferred呼び出しているコードは、何かからを返すようにリファクタリングする必要があります。おそらくそれの実装はIService.stopServiceそれを止めます。このようにする理由は、物事が明らかに「アイドル」である場合でも、原子炉内に何が座っているかを常に知っているとは限らないためです。たとえば、Twistedがスレッドからの通信用のファイル記述子(「ウェイカー」)を維持していることをご存知ですか?HTTPサーバーはcallLater、次のアクセスログエントリを書き込むために常に未処理を維持しますか?サードパーティライブラリのインフラストラクチャの他のビットは、実際にはあなたのビジネスではない、リアクターに任意の異なる状態を残す可能性があります。

ただし、リアクターには少し内省的なサポートがあります。たとえば、、、、がIReactorTime.getDelayedCallsありIReactorFDSet.getReaders/getWritersますIReactorThreads.getThreadPool。ただし、がないIReactorWin32Events.getAllEventsため、これは完全にポータブルなものではありません。デバッグと診断の目的で、より多くのリアクターイントロスペクションの実装に貢献したい場合は、間違いなくありがたいです。

于 2012-08-03T04:44:12.530 に答える