urllib3 connectionpool - 连接池已满,丢弃连接

Jav*_*Fan 35 python connection pool urllib3

是否看到

urllib3.connectionpool WARNING - Connection pool is full, discarding connection
Run Code Online (Sandbox Code Playgroud)

意味着我正在有效地丢失数据(因为连接丢失)
或者这
是否意味着连接被丢弃(因为池已满);但是,当连接池可用时,稍后会重试相同的连接吗?

sha*_*zow 30

没有数据丢失!

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

因为 urllib3 PoolManager 重用连接,它会限制每个 hos保留的连接数,以避免积累太多未使用的套接字。当池没有任何可用的空闲套接字时,可以配置 PoolManager 以避免创建过多的套接字PoolManager(..., block=True)

如果您依赖于并发性,最好将池( maxsize)的大小增加到至少与您使用的线程数一样大,以便每个线程有效地获得自己的连接。

更多细节在这里:https : //urllib3.readthedocs.io/en/latest/advanced-usage.html#customizing-pool-behavior

  • 从您提到的文档来看,这是一个非常错误的答案和解释。没有“稍后重试”,无论池大小如何,所有连接都会立即打开。另外,增加线程数而不更改“maxsize”(或“pool_size”,如果不同的主机)不会使警告消失,它会增加警告! (2认同)
  • @dvdblk:警告和性能之间没有“平衡”:要没有警告,只需使“maxsize”等于您正在使用的工作线程数即可。这样,所有连接都将保留在池中以供重用,因此不会出现警告。要提高性能,只需增加工作线程即可。我读到每个 CPU 核心大约 4-5 个线程对于互联网(即慢速)I/O 是最佳的。 (2认同)

Mes*_*ion 20

根据Customizing Pool Behaviour 的文档,您的两种解释都不正确:

默认情况下,如果发出新请求并且池中没有空闲连接,则会创建一个新连接。但是,如果存在超过 maxsize 连接,则不会保存此连接。这意味着maxsize 并不确定可以向特定主机打开的最大连接数,而只是确定池中保留的最大连接数。

(我的重点)

因此连接不会中止以便稍后重试。他们按照要求立即制作,并返回结果。然后,在它们完成,那些“额外的”连接被丢弃,即它们不会保留在池中以供以后重用。

例如,如果您的maxsize值为 10(使用urllib3via时的默认值requests),并且您并行启动 50 个请求,则这 50 个连接将立即执行,完成后只有 10 个将保​​留在池中,而 40 个将被丢弃(并发出该警告)。