2012-10-12 4 views
5

ich den folgenden Code haben, die einen HTTPConnectionPool mit TwistedMatrix Python-Framework erstellt, und ein Agent für HTTP-Anfragen:Maximale Anzahl von Verbindungen pro Host mit twisted.web.client.Agent

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

dann schaffe ich Anfragen an eine Verbindung zu einem lokalen Server:

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

das Problem ist: der lokale Server manchmal falsch verhält, wenn mehrere gleichzeitigen Anforderungen gestellt werden, so würde Ich mag, die Anzahl der gleichzeitigen Anforderungen begrenzen, auf 1

Die zusätzlichen Anforderungen sollten in die Warteschlange gestellt werden, bis die ausstehende Anforderung abgeschlossen ist.

Ich habe mit self.pool.maxPersistentPerHost = 1 versucht, aber es funktioniert nicht.

Unterstützt twisted.web.client.Agent mit HTTPConnectionPool die maximale Anzahl von Verbindungen pro Host, oder muss ich selbst eine Anfrage-FIFO-Warteschlange implementieren?

Antwort

5

Der Grund Einstellung maxPersistentPerHost-1 nicht geholfen hat, ist, dass maxPersistentPerHost ist die maximale Anzahl von persistenten Verbindungen zu Cache pro Host zu steuern. Es verhindert nicht, dass zusätzliche Verbindungen geöffnet werden, um neue Anforderungen zu bedienen, es bewirkt nur, dass sie unmittelbar nach dem Empfang einer Antwort geschlossen werden, wenn die maximale Anzahl der zwischengespeicherten Verbindungen bereits erreicht wurde.

Sie können die Serialisierung auf verschiedene Arten erzwingen. Eine Möglichkeit, eine "FIFO-Warteschlange" zu haben, ist twisted.internet.defer.DeferredLock. Verwenden Sie es zusammen mit Agent wie folgt aus:

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

Die zweite Anforderung wird erst nach dem ersten Lauf als abgeschlossen.