3

現在、ストリーミング サーバーからデータを受信するために作成した tcp/ip クライアント モジュールを使用する python プログラムがあります。サーバーはデータ行を出力します。

私の TCP クライアント クラスはかなり原始的であり、ねじれた ReconnectingClientFactory を使用するようにリファクタリングしたいと考えています。

メイン プログラムは現在、TCP クライアントの readLines 関数からデータを取得しており、受信した行を「生成」します。

TCP クライアント メソッドには、次の方法でアクセスします。

for msg_buffer in self.myTcpClient.readLines():
    do some stuff with the data in msg_buffer

私の TCP クライアントでは、本質的に readLines メソッドは次のようになります。

while True:
    newLine = self.sock.recv(self.buffer_size)
    yield newLine

ツイスト クライアントを実装するとき、イテレータとして動作し、データを生成する何らかの方法が必要です。プロトコルの dataReceived メソッドで何かを行うと思います。

これがどのように機能するかを理解しようとして迷っています。ツイストされた deferred はこの種の使用を意図しているように見えますが、目的のために deferred を使用する方法がわかりません (deferred に関する私の仮定が正しい場合)。

完璧な世界では、ねじれたクライアントは受信したとおりに回線を生成するため、現在のメソッドと同様の呼び出しが機能します。すなわち

class GetData(protocol):
    def dataReceived(self, data):
        yield data

しかし、それは単純化しすぎだと思います。

要約すると、私がやろうとしているのは、私の readLines メソッドのように動作し、多かれ少なかれ次のようにアクセスできるねじれた再接続 TCP クライアントを実装することです。

for msg_buffer in self.twistedTcpClient.readLines():

どんなポインタでも大歓迎です

更新:ツイストの「かぎ針編み」を偶然見つけました。一見したところ、Crochet はまさに私が必要としている種類のモデル用に設計されているように見えます... いくつかのテストの後、報告します

4

1 に答える 1

1

これを行う Twisted の方法は、プロトコルを作成することです。代わりに:

for line in self.twistedTcpClient.readLines():
    process_line(line) ...

Protocol を記述します (おそらく a をサブクラス化してtwisted.protocols.basic.LineReceiver):

class MyProtocol(LineReceiver):
    ...
    def lineReceived(self, line):
        process_line(line) ...

lineReceived反復ループではなく、コールバックを使用するようにコードをリファクタリングしたい。

あなたが書いたもの:

for line in self.twistedTcpClient.readLines():
    process_line(line) ...

Twisted は非同期であるため、問題があります。メソッドを待っている間、Twisted が他のことをする方法はありませんtwistedTcpClient.readLines()

プロトコルを作成することをお勧めしますが、このイテレータ パターンを使用することを本当に主張する場合は、次のようにすることもできます。

@inlineCallbacks
def my_func():
    while True:
        try:
            line = yield self.twistedTcpClient.getNextLine()
        except StopIteration:
            break

        process_line(line) ...

ここで注意が必要なのは、getNextLine() を呼び出すたびにtwistedTcpClientreturnを行うことです。Deferreds多分このようなもの:

class MyProtocol(LineReceiver):
    ...
    def getNextLine(self):
        self.defer_given_out = Deferred()

    def lineReceived(self, line):
        self.defer_given_out.callback(line)

    def connectionLost(self):
        self.defer_given_out.errback(StopIteration())

(これはアイデアを示す単なる例です。詳細を処理するには、それを拡張する必要があります。)

于 2013-11-15T18:14:07.137 に答える