Twistedの新しいトランスポートおよびリーダータイプ
-
06-07-2019 - |
質問
Twistedに新しいトランスポートを追加しようとしています。これは、ストリームからデータを読み取ります- tail -f
方式のファイル、またはパイプからのいずれかですが、いくつかの問題がありますツイストアーキテクチャを使用。
トランスポート自体( ITransport
を実装)の準備ができています-すべてのファイルのオープンを処理します。ストリーミング機能/遅延の準備ができました。今どのようにまとめるのですか?新しいデータをプロトコルの dataReceived()
に報告したい。
もちろん、適切なコールバックでI / Oモニターを設定し、リアクターのシャットダウン時にコールバックを登録して(ファイル/プロトコルを閉じる)、すべてを手動で起動する新しいオブジェクトを作成できますが、それは"です正しい方法&quot ;?私が使用できるより良い抽象化はありますか? reactor.connectWith()
を見てきましたが、実際には多くの抽象化を提供していません...
また-リーダーからプロトコルにデータを渡す方法は? ITransportは、トランスポートの責任のように見えますが、インターフェースを定義していません。
解決
これを行う方法はほとんどわかっているようです。 twisted.internet.fdesc.readFromFD
に興味があるかもしれませんが、長さはほんの数行で、特に複雑なことは何もしていません(ただし、維持する必要のない数行です)。それとは別に-はい、この場合はI / O監視を行う必要があります。通常のファイル記述子はselect / poll / epollでサポートされていないためです(必要なものではなく、常に準備完了として報告されます)。
Twistedでinotifyをサポートするためにいくつかの作業が行われました( http://twistedmatrix.com/trac/ticket / 972 )しかし、これはまだ完全ではないので、(あなたがそれを終了して使用するのを手伝いたいのでなければ)今は直接あなたに役立たないでしょう。時間ベースのポーリングを使用すると仮定すると、リアクターにあるものの多くは、システムが提供する準備API(つまり、選択/ポーリング/エポール)を使用してイベントをトリガーすることに焦点を当てているため、あまり役に立ちません。
ただし、パイプの場合は、 IReactorFDSet
のメソッド- addReader
などを使用し、その恩恵を受けることができるはずです。
時間ベースのポーリングトランスポートは、 ITransport
を実装することでメリットが得られる場合がありますが、 tail -f <の
write
をどのように実装するかはわかりませんが/ code>のようなトランスポート。トランスポートに IProtocol
インターフェースを介してデータを配信させると、コードの再利用が簡単になるため、間違いなくメリットがあります。 IProtocol.dataReceived
は、まさに reader からデータを渡したい方法です( transport と同じだと思いますか? )。これは、トランスポートではない他のオブジェクトで呼び出すメソッドであるため、 ITransport
では定義されません。
reactor.connectWith
はおそらく何も買わないでしょう。あなたが言うように、それは抽象化ではありません。もっと間違いだと思います。 :)
リアクタにメソッドを直接追加できないことについてあまり心配しないでください。リアクターをパラメーターとして受け入れる自由関数は、簡単に使用できます。
シャットダウンコールバックの場合、実際には addReader
でほとんどの方法で取得できます。シャットダウン時にリアクター内のリーダーには、 connectionLost
が呼び出されます( IFileDescriptor
の一部)。これを実装して、ファイルとプロトコルをクリーンアップする必要があります。