使用twisted.web.client.Agent的每个主机的最大连接数

Enr*_*oma 5 python twisted

我有以下代码,它使用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队列?

Jea*_*one 5

之所以设置maxPersistentPerHost1没有帮助的是,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)

第二个请求将在第一个请求完成之后才会运行.