2

hereにある Twisted を使用した単純な python プロキシの例を理解しようとしています。プロキシはサーバー クラスをインスタンス化し、次にクライアント クラスをインスタンス化します。defer.DeferredQueue() は、クライアント クラスからサーバー クラスにデータを渡すために使用されます。

この例で defer.DeferredQueue() がどのように機能するかを理解しようとしています。たとえば、次のステートメントの意味は何ですか。

self.srv_queue.get().addCallback(self.clientDataReceived)

そしてそれは類似しています

self.cli_queue.get().addCallback(self.serverDataReceived)

声明。

self.cli_queue.put(False) または self.cli_queue = Noneを実行するとどうなりますか?

ただ今 Twisted を理解しようとしているところなので、かなり大変なようです。物事がどのように接続されているかについて少し説明すると、これを理解するのがはるかに簡単になります.

4

1 に答える 1

2

ドキュメントによると、DeferredQueue にはputオブジェクトをキューに追加する通常のメソッドと deferredgetメソッドがあります。

このgetメソッドは Deferred オブジェクトを返します。callbackオブジェクトにメソッド (例: ) を追加serverDataReceivedします。オブジェクトがキューで利用可能になると、Deferred オブジェクトはcallbackメソッドを呼び出します。オブジェクトは引数としてメソッドに渡されます。キューが空の場合、または serverDataReceived メソッドの実行が終了していない場合でも、プログラムは次のステートメントの実行を続行します。キューで新しいオブジェクトが利用可能にcallbackなると、プログラムの実行ポイントに関係なくメソッドが呼び出されます。

つまり、BlockingQueue がある同期フロー モデルとは対照的に、これは非同期フローです。つまり、プログラムはキューで次に利用可能なオブジェクトが実行を継続するまで待機します。

サンプル プログラムself.cli_queue.put(False)で、False オブジェクトをキューに追加します。これは、キューにデータが追加されないことを ProxyClient スレッドに通知する一種のフラグです。そのため、リモート接続を切断する必要があります。コードのこの部分を参照できます。

def serverDataReceived(self, chunk):
        if chunk is False:
            self.cli_queue = None
            log.msg("Client: disconnecting from peer")
            self.factory.continueTrying = False
            self.transport.loseConnection()

cli_queue = None を設定すると、接続が閉じられた後にキューが破棄されます。

于 2012-09-24T08:00:01.910 に答える