これを行う方法をほとんど理解しているようです。あなたは興味があるかもしれませんが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
どのように実装するかはわかりません。コードの再利用が簡単に なるため、トランスポートにインターフェイスを介してデータを配信させることで、間違いなくメリットが得られます。まさにあなたがあなたの読者からデータを渡したい方法です(私はあなたの輸送と同じだと思いますね?)。これは、トランスポートではない他のオブジェクトで呼び出すメソッドであるため、で定義されていません。write
tail -f
IProtocol
IProtocol.dataReceived
ITransport
reactor.connectWith
おそらくあなたに何も買わないでしょう。あなたが言うように、それはあまり抽象化ではありません。それはもっと間違いだと思います。:)
メソッドをリアクターに直接追加できないことについてはあまり心配しないでください。リアクターをパラメーターとして受け入れるフリー関数も同様に使いやすいです。
シャットダウンコールバックの場合、addReader
実際にはほとんどの方法でそこに到達するはずです。シャットダウン時に原子炉内のすべてのリーダーがそれをconnectionLost
呼び出します(の一部IFileDescriptor
)。これを実装して、ファイルとプロトコルをクリーンアップする必要があります。