2012-10-12 16 views
5

Ho il seguente codice che crea un HTTPConnectionPool utilizzando framework TwistedMatrix Python, e un agente per le richieste HTTP:Numero massimo di connessioni per host con 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) 

poi creare richieste a connettersi a un server locale:

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

il problema è: il server locale a volte si comporta in modo non corretto quando più richieste simultanee sono fatti, così vorrei limitare il numero di richieste simultanee a 1.

Le richieste aggiuntive devono essere accodate fino al completamento della richiesta in sospeso.

Ho provato con self.pool.maxPersistentPerHost = 1 ma non funziona.

twisted.web.client.Agent con supporto HTTPConnectionPool che limita il numero massimo di connessioni per host o devo implementare una coda FIFO richiesta anch'essa?

risposta

5

L'impostazione maxPersistentPerHost-1 non aiuta ragione è che maxPersistentPerHost è per controllare il numero massimo di connessioni persistenti per di cache per host. Non impedisce l'apertura di ulteriori connessioni per soddisfare le nuove richieste, ma le farà chiudere immediatamente dopo la ricezione di una risposta, se il numero massimo di connessioni memorizzate nella cache è già stato raggiunto.

È possibile applicare la serializzazione in diversi modi. Un modo per avere una "coda FIFO" è con twisted.internet.defer.DeferredLock. Usalo insieme Agent in questo modo:

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

La seconda richiesta, non verrà eseguito fino a dopo la prima come completata.

Problemi correlati