在请求库中,我怎样才能避免" HttpConnectionPool已满,丢弃连接"警告?

时间:2014-05-13 13:36:21

标签: python multithreading python-requests httplib grequests

我在会话中使用python请求库:

def _get_session(self):
    if not self.session:
        self.session = requests.Session()
    return self.session

有时我会在日志中收到此警告:

[2014/May/12 14:40:04 WARNING ] HttpConnectionPool is full, discarding connection: www.ebi.ac.uk

我的问题是:为什么这是警告而不是例外?

这是负责此事的代码(来自http://pydoc.net/Python/requests/0.8.5/requests.packages.urllib3.connectionpool/):

def _put_conn(self, conn):
    try:
        self.pool.put(conn, block=False)
    except Full:
        # This should never happen if self.block == True
        log.warning("HttpConnectionPool is full, discarding connection: %s"
                    % self.host)

为什么会遇到此异常?如果它被重新启动,我可以在我的代码中处理此异常,方法是创建新会话并删除旧会话。

如果它只是一个警告,是否意味着它不会以任何方式影响我的结果?我可以忽略它吗?如果没有,我该如何处理这种情况?

2 个答案:

答案 0 :(得分:11)

来自http://docs.python-requests.org/en/latest/api/

中的请求文档
 class requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=0, pool_block=False)
     

内置的urllib3 HTTP适配器。

     

通过实现传输适配器,为请求会话提供一个通用案例接口,以便联系HTTP和HTTPS URL   接口。该类通常由Session类创建   在幕后。

     

参数:

     
      
  • pool_connections - 要缓存的urllib3连接池的数量。
  •   
  • pool_maxsize - 要在池中保存的最大连接数。
  •   
  • max_retries(int) - 每个连接应尝试的最大重试次数。请注意,这仅适用于失败的连接和超时,从不适用于服务器返回响应的请求。
  •   
  • pool_block - 连接池是否应阻止连接。
  •   

以及稍微下面的一个例子

import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(max_retries=3)
s.mount('http://', a)

试试这个

a = requests.adapters.HTTPAdapter(pool_connections = N, pool_maxsize = M)

N和M适合您的计划。

答案 1 :(得分:0)

我想在这里澄清一些东西。

max_poolsize参数的作用是限制可以同时存储在连接池中的TCP连接的数量。通常,当您要执行HTTP请求时,请求将尝试从其连接池中获取TCP连接。如果没有可用的连接,请求将创建一个 new TCP连接,并且在完成HTTP请求后,它将尝试将其放回池中(它不会记住该连接是否是否从连接池中获取)。

在请求代码中引发的Full异常只是常见Python模式的一个示例,通常将其解释为,请求宽恕比获得许可要容易。断开TCP连接没有任何帮助。