17

我正在使用带有会话的 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)

为什么这里会捕获此异常?如果它被重新提出,我可以在我的代码中处理这个异常,方法是创建新会话并删除旧会话。

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

4

2 回答 2

14

来自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 适合您的程序。

于 2014-05-13T13:49:41.893 回答
3

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

参数所做的是pool_maxsize限制可以同时存储在连接池中的 TCP 连接数。通常,当您要执行 HTTP 请求时,请求会尝试从其连接池中获取 TCP 连接。如果没有可用的连接,请求将创建一个的TCP 连接,当它发出一个 HTTP 请求时,它会尝试将它放回池中(它不会记住该连接是从连接池中获取的还是不是)。

HttpConnectionPool is fullrequests 代码中出现的警告只是常见 Python 模式的一个示例,通常被解释为请求原谅比请求许可更容易。它与丢弃 TCP 连接无关。

于 2019-04-18T13:01:58.203 回答