5

TwistedMatrix Python フレームワークを使用して HTTPConnectionPool を作成する次のコードと、HTTP 要求のエージェントがあります。

    self.pool = HTTPConnectionPool(reactor, persistent=True)
    self.pool.retryAutomatically = False
    self.pool.maxPersistentPerHost = 1
    self.agent = Agent(reactor, pool=self.pool)

次に、ローカル サーバーに接続するためのリクエストを作成します。

    d = self.agent.request(
        "GET",
         url,
         Headers({"Host": ["localhost:8333"]}),
         None)

問題は、複数の同時リクエストが行われるとローカル サーバーが正しく動作しない場合があるため、同時リクエストの数を 1 つに制限したいということです。

追加のリクエストは、保留中のリクエストが完了するまでキューに入れておく必要があります。

で試しましself.pool.maxPersistentPerHost = 1たが、うまくいきません。

twisted.web.client.Agent と HTTPConnectionPool は、ホストごとの最大接続数の制限をサポートしていますか? それとも、リクエスト FIFO キューを自分で実装する必要がありますか?

4

1 に答える 1

5

設定maxPersistentPerHost1役に立たなかった理由は、ホストごとにキャッシュmaxPersistentPerHostする持続接続の最大数を制御するためです。新しいリクエストを処理するために追加の接続が開かれるのを防ぐことはできません。キャッシュされた接続の最大数にすでに達している場合、応答が受信された直後に接続が閉じられるだけです。

シリアル化はさまざまな方法で強制できます。「FIFOキュー」を持つ1つの方法は、twisted.internet.defer.DeferredLock. Agent次のように一緒に使用します。

lock = DeferredLock()
d1 = lock.run(agent.request, url, ...)
d2 = lock.run(agent.request, url, ...)

2 番目の要求は、最初の要求が完了するまで実行されません。

于 2012-10-12T18:25:12.773 に答える