我有以下代码,它使用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)
Run Code Online (Sandbox Code Playgroud)
然后我创建连接到本地服务器的请求:
d = self.agent.request(
"GET",
url,
Headers({"Host": ["localhost:8333"]}),
None)
Run Code Online (Sandbox Code Playgroud)
问题是:当多个同时发出请求时,本地服务器有时行为不正确,所以我想将同时请求的数量限制为1.
其他请求应排队,直到挂起的请求完成.
我试过self.pool.maxPersistentPerHost = 1但它不起作用.
使用HTTPConnectionPool的twisted.web.client.Agent是否支持限制每个主机的最大连接数,或者我是否必须自己实现请求FIFO队列?
之所以设置maxPersistentPerHost到1没有帮助的是,maxPersistentPerHost对于控制持久连接的最大数目缓存每台主机.它不会阻止打开其他连接以便为新请求提供服务,它只会在收到响应后立即关闭它们,如果已达到最大缓存连接数.
您可以通过多种方式强制执行序列化.拥有"FIFO队列"的一种方法是使用twisted.internet.defer.DeferredLock.Agent像这样使用它:
lock = DeferredLock()
d1 = lock.run(agent.request, url, ...)
d2 = lock.run(agent.request, url, ...)
Run Code Online (Sandbox Code Playgroud)
第二个请求将在第一个请求完成之后才会运行.