urllib3 连接池 - 连接池已满,正在丢弃连接

问题描述 投票:0回答:3

看到了吗

urllib3.connectionpool WARNING - Connection pool is full, discarding connection

意味着我实际上正在丢失数据(因为失去连接)

这是否意味着连接被丢弃(因为池已满);但是,当连接池可用时,稍后会重新尝试相同的连接?

python connection pool urllib3
3个回答
73
投票

没有数据丢失!

请求完成后连接将被丢弃(因为池已满,如上所述)。这意味着这个特定的连接将来不会被重复使用。

因为 urllib3 PoolManager 重用连接,它将限制每个主机

保留的连接数量,以避免积累太多未使用的套接字。 PoolManager 可以配置为避免在池没有任何空闲套接字可用时创建过多套接字,PoolManager(..., block=True)


如果您依赖并发性,最好将

池的大小 (maxsize

) 增加到至少与您正在使用的线程数一样大,以便每个线程有效地运行获得自己的连接。

更多详细信息请参见:

https://urllib3.readthedocs.io/en/latest/advanced-usage.html#customizing-pool-behavior


25
投票
根据

自定义池行为的文档,您的解释都不正确:

默认情况下,如果发出新请求并且池中没有空闲连接,则会创建一个新连接。但是,如果存在超过 maxsize 连接,则不会保存此连接。这意味着

maxsize 并不确定可以向特定主机打开的最大连接数,而只是确定池中保留的最大连接数。

(我的重点)

因此连接

没有

被中止以便稍后重试。他们按照要求“立即”制作,并返回结果。然后,它们完成之后,那些“额外的”连接被丢弃,即,它们没有保留在池中以供以后重用。 例如,如果您的 maxsize 为 10(通过

urllib3

使用

requests
时的默认值),并且您并行发起 50 个请求,则这 50 个连接将立即执行,完成后仅保留 10 个连接池中的 40 个将被丢弃(并发出警告)。
    
有谁知道如何抑制此消息?
我有一个多线程 python 应用程序,过了一段时间,这些消息太多了,我无法破译日志中的其他任何内容。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.