看到
urllib3.connectionpool WARNING - Connection pool is full, discarding connection
意思是我的数据会因为连接丢失而有效地丢失(由于连接中断)或者这是否意味着连接已经断开(因为池已满); 但是,当连接池可用时,相同的连接将稍后重新尝试?
看到
urllib3.connectionpool WARNING - Connection pool is full, discarding connection
意思是我的数据会因为连接丢失而有效地丢失(由于连接中断)没有数据丢失!
连接在请求完成后被丢弃(因为池已满,如前所述)。这意味着这个特定的连接将来不会被重用。
由于urllib3 PoolManager会重用连接,它会限制每个主机保留多少个连接,以避免积累太多未使用的套接字。当池中没有任何空闲套接字可用时,可以配置PoolManager以避免创建过多的套接字,方法是使用PoolManager(..., block=True)
。
如果您依赖并发性,增加池的大小(maxsize
)至少与您使用的线程数一样大可能是一个好主意,这样每个线程实际上都有自己的连接。
更多详细信息请参阅:https://urllib3.readthedocs.io/en/latest/advanced-usage.html#customizing-pool-behavior
maxsize
(或pool_size
,如果使用不同的主机),_增加_线程数将不能消除警告,反而会增加它们! - MestreLionmaxsize
设置为您正在使用的工作线程数即可。这样,所有连接都将保留在池中以供重用,因此不会出现警告。而要提高性能,只需增加您的工作线程。我读到过,在互联网(即慢速)I/O方面,每个CPU核心大约需要4-5个线程是最优的。 - MestreLionurllib3
将始终打开您请求的所有连接,即使在使用后丢弃一些连接。 - MestreLionmaxsize
为10(使用requests
时的默认值为10),并且您同时发起了50个请求,那么这50个连接将立即执行,并在完成后仅有10个连接保留在池中,而其余40个则被丢弃(并引发警告)。