Python urllib3:过一段时间后关闭空闲连接

问题描述 投票:2回答:2

是否有办法告诉Python urllib3在一段时间后不重用空闲连接,而是关闭它们?

查找https://urllib3.readthedocs.io/en/latest/reference/index.html#module-urllib3.connectionpool似乎没有显示任何相关内容。

python http tcp keep-alive urllib3
2个回答
2
投票

记住:

连接池是维护数据库连接的缓存,因此当将来向服务器发送请求时,可以“重用”连接数据库是必需的。

您可以通过多种方式(我想):

  • 将重试次数设为一。

如果一次失败,这将中断您的连接。进行设置:

import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(max_retries=1) # is zero for default
s.mount('http://', a)

  • 更改池连接。

“ pool_connections”是要保留的主机池数。例如,如果您要连接到100个不同的主机和pool_connections=10,则仅重用最近的10个主机的连接。进行设置:

s = requests.Session()
s.mount('https://', HTTPAdapter(pool_connections=1))
s.get('https://www.example.com')

这将停止池的重用。


  • Pool Maxsize

仅当您在多线程环境中使用Session时,此设置才有意义。进行设置:

s = requests.Session()
s.mount('https://', HTTPAdapter(pool_connections=1, pool_maxsize=1))

  • 配置最大大小

he:class:~connectionpool.ConnectionPool class保留了单个:class:~connection.HTTPConnection实例的池。这些连接在单个请求期间使用,并在请求完成后返回到池中。默认情况下,将仅保存一个连接以供重用。要设置它(默认情况下是):

from urllib3 import HTTPConnectionPool
pool = HTTPConnectionPool('www.example.com', maxsize=0) #likely to slow you down cuz it never stores the pools

maxsize –可以重复使用的保存连接数。在多线程情况下,大于1是有用的。


  • 让池管理器做到这一点!

PoolManager使用最近最少使用(LRU)策略来丢弃旧池。也就是说,如果将PoolManager num_pools设置为10,则在向11个或更多不同的主机发出请求之后,将最终清理最近最少使用的池。为此:

from urllib3 import PoolManager
manager = PoolManager(1) # not the manager cleans up pools used for one time
r = manager.request('GET', 'http://www.example.com/')

另外,文档说:

陈旧池的清理不会立即发生。

因此使用RecentlyUsedContainer(文档仅包含一行)。


希望这对您有所帮助。获取高级用法文档HERE


0
投票

首先,您可以定义num_pools变量,以便如果它超过已经创建的池的值,那么它将丢弃最近最少使用的池。您也可以在连接上设置timeout,以便连接可以在超时后自动关闭。我也找不到任何确定空闲连接的东西,但是我想这可能会有所帮助

https://laike9m.com/blog/requests-secret-pool_connections-and-pool_maxsize,89/

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