我有以下代码,它使用TwistedMatrix Python框架和HTTP请求代理创建HTTPConnectionPool:
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
,但它不起作用。
使用HTTPConnectionPool的twisted.web.client.Agent是否支持限制每个主机的最大连接数,或者我是否必须自己实现请求FIFO队列?
答案 0 :(得分:5)
将maxPersistentPerHost
设置为1
无效的原因是maxPersistentPerHost
用于控制每台主机缓存的最大持久连接数。它不会阻止打开其他连接以便为新请求提供服务,只有在收到响应后,如果已达到最大缓存连接数,它才会立即关闭它们。
您可以通过多种方式强制执行序列化。拥有“FIFO队列”的一种方法是使用twisted.internet.defer.DeferredLock
。与Agent
一起使用,如下所示:
lock = DeferredLock()
d1 = lock.run(agent.request, url, ...)
d2 = lock.run(agent.request, url, ...)
第二个请求直到第一个请求完成后才会运行。