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

18

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

为什么这个异常在这里被捕获了?如果它被重新引发,我可以通过创建一个新会话并删除旧会话来在我的代码中处理此异常。

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


1
你尝试将 self.block 设置为 True 了吗? - roippi
1
我真的想要我的请求阻塞吗?也许这个警告会消失,但是还有其他后果吗?这不是默认情况下为什么不是True的原因吗? - mnowotka
:param block: If set to True, no more than **maxsize** connections will be used at a time. When no free connections are available, the call will block until a connection has been released. - roippi
1
那么,当没有空闲连接时,你要么尝试连接阻塞,要么将其丢弃。由你选择。 - roippi
1
但这是否意味着,如果将其设置为False,则会使用超过maxsize连接,因此我仍然安全? - mnowotka
显示剩余3条评论
2个回答

16

来自Python Requests文档

需要进一步翻译的内容请提供。
 class requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=0, pool_block=False)

urllib3 的内置 HTTP 适配器。

通过实现 Transport Adapter 接口,为 Requests 会话提供了一个通用的接口,以便联系 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适合你的程序。


在我的情况下,M的理想值是无穷大 :) 如果我使用任何特定的M值,那么我需要计算在此会话中已经发出了多少请求,然后将其丢弃,对吗? - mnowotka
你是并行还是串行地关闭连接?那么如何显式地关闭 Response 对象呢? - andmart
接下来,你需要选择如何处理当连接池达到极限的情况。可以增加极限值或者等待新请求。另外一种方法是寻找在代码中不必要的响应对象,并显式地关闭它们。 - andmart
我想在这里等待更有意义。好的,非常感谢! - mnowotka
我在想是否有任何公式可以计算M值? - jerryleooo
@jerryleooo:一个好的起点是你正在使用的工作线程数量。 - MestreLion

3
我希望在这里澄清一些事情。 pool_maxsize参数限制可以同时存储在连接池中的TCP连接数量。通常情况下,当您想执行HTTP请求时,请求将尝试从其连接池中获取TCP连接。如果没有可用的连接,则请求将创建一个新的 TCP连接,并在完成HTTP请求后尝试将其放回池中(它不会记住连接是从连接池中获取还是新创建的)。
在requests代码中引发 HttpConnectionPool is full警告只是通常被称为更容易通过请求原谅而不是请求许可的Python模式的示例。这与丢弃TCP连接无关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接