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

时间:2012-10-12 08:13:07

标签: 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)

然后我创建连接到本地服务器的请求:

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

问题是:当同时发出多个请求时,本地服务器有时会出现错误行为,因此我希望将同时请求的数量限制为1。

其他请求应排队,直到挂起的请求完成。

我尝试使用self.pool.maxPersistentPerHost = 1,但它不起作用。

使用HTTPConnectionPool的twisted.web.client.Agent是否支持限制每个主机的最大连接数,或者我是否必须自己实现请求FIFO队列?

1 个答案:

答案 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, ...)

第二个请求直到第一个请求完成后才会运行。