看到了吗
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 连接,则不会保存此连接。这意味着maxsize 并不确定可以向特定主机打开的最大连接数,而只是确定池中保留的最大连接数。
(我的重点)
因此连接
没有被中止以便稍后重试。他们按照要求“立即”制作,并返回结果。然后,在它们完成之后,那些“额外的”连接被丢弃,即,它们没有保留在池中以供以后重用。
例如,如果您的 maxsize
为 10(通过
urllib3
使用
requests
时的默认值),并且您并行发起 50 个请求,则这 50 个连接将立即执行,完成后仅保留 10 个连接池中的 40 个将被丢弃(并发出警告)。有谁知道如何抑制此消息? 我有一个多线程 python 应用程序,过了一段时间,这些消息太多了,我无法破译日志中的其他任何内容。