【问题标题】:Maximum number of connections per host with twisted.web.client.Agent每个主机使用 twisted.web.client.Agent 的最大连接数
【发布时间】:2012-10-12 08:13:07
【问题描述】:

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

【问题讨论】:

    标签: python twisted


    【解决方案1】:

    maxPersistentPerHost 设置为1 没有帮助的原因是maxPersistentPerHost 用于控制每个主机到缓存 的最大持久连接数。它不会阻止打开额外的连接来为新请求提供服务,它只会在收到响应后立即关闭它们,前提是已经达到缓存连接的最大数量。

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 2018-11-15
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多