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
Mes*_*ion 20
根据Customizing Pool Behaviour 的文档,您的两种解释都不正确:
默认情况下,如果发出新请求并且池中没有空闲连接,则会创建一个新连接。但是,如果存在超过 maxsize 连接,则不会保存此连接。这意味着maxsize 并不确定可以向特定主机打开的最大连接数,而只是确定池中保留的最大连接数。
(我的重点)
因此连接不会中止以便稍后重试。他们按照要求立即制作,并返回结果。然后,在它们完成后,那些“额外的”连接被丢弃,即它们不会保留在池中以供以后重用。
例如,如果您的maxsize
值为 10(使用urllib3
via时的默认值requests
),并且您并行启动 50 个请求,则这 50 个连接将立即执行,完成后只有 10 个将保留在池中,而 40 个将被丢弃(并发出该警告)。