2

Twistedに新しいトランスポートを追加しようとしています。これにより、ストリームからデータが読み取られます。あるtail -f意味でファイルから、またはパイプからデータが読み取られますが、Twistedアーキテクチャに問題があります。

トランスポート自体(実装ITransport)の準備ができました-すべてのファイルを開くことができます。ストリーミング機能/遅延の準備ができました。どうすれば今それをまとめることができますか?新しいデータをいくつかのプロトコルに報告したいと思いますdataReceived()

もちろん、適切なコールバックを使用してI / Oモニターをセットアップし、(ファイル/プロトコルを閉じるために)リアクターのシャットダウン時にコールバックを登録し、すべてを手動で起動する新しいオブジェクトを作成することもできますが、それは「正しい方法」です。 ?私が使用できるより良い抽象化はありますか?私は見reactor.connectWith()たことがありますが、それは実際には多くの抽象化を提供していません...

また、リーダーからプロトコルにデータを渡すにはどうすればよいですか?ITransportは、トランスポートの責任のように見えますが、そのためのインターフェイスを定義していません。

4

1 に答える 1

5

これを行う方法をほとんど理解しているようです。あなたは興味があるかもしれませんがtwisted.internet.fdesc.readFromFD、それはほんの数行の長さであり、特に複雑なことは何もしていません(ただし、維持する必要のない数行です)。それとは別に、この場合はI / O監視を行う必要があります。これは、通常のファイル記述子がselect / poll / epollでサポートされていないためです(必要なものではなく、常に準備ができていると報告されます)。

Twisted( http://twistedmatrix.com/trac/ticket/972 )でinotifyをサポートするための作業がいくつか行われていますが、これはまだ完了していないため、(支援したい場合を除いて)直接役立つことはありません。仕上げてから使用してください)。時間ベースのポーリングを使用していると仮定すると、そのコードはシステムが提供する準備API(つまり、select / poll / epoll)を使用してイベントをトリガーすることに焦点を当てているため、reactorにあるものの多くはあまり役に立ちません。 。

IReactorFDSetただし、パイプの場合は、のメソッドを使用してその恩恵を受けることができるはずですaddReader

時間ベースのポーリングトランスポートは、実装することでメリットが得られる可能性があります。ただし、のようなトランスポートをITransportどのように実装するかはわかりません。コードの再利用が簡単に なるため、トランスポートにインターフェイスを介してデータを配信させることで、間違いなくメリットが得られます。まさにあなたがあなたの読者からデータを渡したい方法です(私はあなたの輸送と同じだと思いますね?)。これは、トランスポートではない他のオブジェクトで呼び出すメソッドであるため、で定義されていません。writetail -fIProtocolIProtocol.dataReceivedITransport

reactor.connectWithおそらくあなたに何も買わないでしょう。あなたが言うように、それはあまり抽象化ではありません。それはもっと間違いだと思います。:)

メソッドをリアクターに直接追加できないことについてはあまり心配しないでください。リアクターをパラメーターとして受け入れるフリー関数も同様に使いやすいです。

シャットダウンコールバックの場合、addReader実際にはほとんどの方法でそこに到達するはずです。シャットダウン時に原子炉内のすべてのリーダーがそれをconnectionLost呼び出します(の一部IFileDescriptor)。これを実装して、ファイルとプロトコルをクリーンアップする必要があります。

于 2009-11-29T04:31:31.650 に答える