5

我有以下代码使用 TwistedMatrix Python 框架创建 HTTPConnectionPool 和 HTTP 请求代理:

    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 队列?

4

1 回答 1

5

设置maxPersistentPerHost1没有帮助的原因是为了控制每个主机缓存maxPersistentPerHost的最大持久连接数。它不会阻止打开其他连接以服务新请求,它只会在收到响应后立即关闭它们,如果已经达到缓存连接的最大数量。

您可以通过多种方式强制执行序列化。拥有“FIFO 队列”的一种方法是使用twisted.internet.defer.DeferredLock. 像这样一起使用它Agent

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

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

于 2012-10-12T18:25:12.773 回答