2012-10-12 44 views
5

he el siguiente código que crea un marco HTTPConnectionPool usando TwistedMatrix Python, y un agente para las peticiones HTTP:número máximo de conexiones por 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) 

entonces crear solicitudes a conectarse a un servidor local:

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

el problema es: el servidor local a veces se comporta de forma incorrecta cuando se realizan varias peticiones simultáneas, por lo que me gustaría limitar el número de solicitudes simultáneas a 1.

Las solicitudes adicionales deben ponerse en cola hasta que finalice la solicitud pendiente.

Lo he intentado con self.pool.maxPersistentPerHost = 1 pero no funciona.

¿Twisted.web.client.Agent con HTTPConnectionPool admite la limitación de la cantidad máxima de conexiones por host, o tengo que implementar una cola de solicitud FIFO?

Respuesta

5

El ajuste maxPersistentPerHost a 1 no ayudó razón es que maxPersistentPerHost es para controlar el número máximo de conexiones persistentes para caché por host. No impide que se abran conexiones adicionales para atender nuevas solicitudes, solo hará que se cierren inmediatamente después de recibir una respuesta, si ya se ha alcanzado el número máximo de conexiones en caché.

Puede aplicar la serialización de varias formas. Una forma de tener una "cola FIFO" es con twisted.internet.defer.DeferredLock. Usarlo junto con Agent así:

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

La segunda solicitud no se ejecutará hasta después de la primera como completada.

Cuestiones relacionadas