在requests库中,如何避免“HttpConnectionPool已满,丢弃连接”的警告?

18 投票
2 回答
21345 浏览
提问于 2025-04-18 06:24

我在用Python的requests库和会话功能:

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 个回答

3

我想在这里澄清一些事情。

pool_maxsize这个参数的作用是限制同时可以存储在连接池中的TCP连接数量。通常,当你想发送一个HTTP请求时,请求会尝试从它的连接池中获取一个TCP连接。如果没有可用的连接,请求就会创建一个新的 TCP连接。当HTTP请求完成后,它会尝试把这个连接放回连接池中(它不会记得这个连接是从连接池中拿的还是新创建的)。

在请求代码中出现的HttpConnectionPool is full警告只是一个常见的Python编程模式的例子,通常可以理解为请求原谅比请求许可更简单。这和断开TCP连接没有关系。

16

来自Requests文档,链接在这里: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适配器。

它为Requests会话提供了一个通用的接口,可以通过实现传输适配器接口来联系HTTP和HTTPS网址。通常,这个类会在Session类的内部被创建。

参数说明:

  • pool_connections – 要缓存的urllib3连接池的数量。
  • pool_maxsize – 连接池中可以保存的最大连接数。
  • max_retries (整数) – 每个连接应该尝试的最大重试次数。注意,这个只适用于连接失败和超时的情况,而不适用于服务器已经返回响应的请求。
  • 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要根据你的程序来设置。

撰写回答