Из aiohttp
документов:
[An aiohttp.ClientSession
] инкапсулирует пул соединений (экземпляр соединителя) и поддерживает сообщения активности по умолчанию. Если вы не подключаетесь к большому, неизвестному количеству различных серверов в течение срока службы вашего приложения, рекомендуется использовать один сеанс в течение всего срока службы вашего приложения, чтобы воспользоваться пулами соединений.
Я почти всегда использовал практику хранения одного экземпляра ClientSession
(с включенными файлами cookie и настраиваемым соединителем / адаптером *) для любого размера или контейнера URL-адресов, независимо от того, насколько неоднородны эти URL-адреса или сколько их имеются. Я хотел бы знать, есть ли недостатки этого подхода.
Я надеюсь получить более детальное, контекстуальное определение того, что "большое, неизвестное количество различных серверов" составляет на практике. Каковы лучшие практики для случаев, подобных представленному ниже? Должен ли ClientSession
выделяться каждому netloc, а не одному экземпляру для всего набора? ** Решение о том, использовать ли один сеанс клиента, определяется исключительно временем ответа?
Часто бывает, что у меня есть "партии" конечных точек; netloc для каждой партии однороден, но netloc между партиями разные. Например,
urls = {
'https://aiohttp.readthedocs.io/en/stable/index.html',
'https://aiohttp.readthedocs.io/en/stable/client_reference.html',
'https://aiohttp.readthedocs.io/en/stable/web_advanced.html#aiohttp-web-middlewares',
'https://www.thesaurus.com/',
'https://www.thesaurus.com/browse/encapsulate',
'https://www.thesaurus.com/browse/connection?s=t',
'https://httpbin.org/',
'https://httpbin.org/#/HTTP_Methods',
'https://httpbin.org/status/200'
}
Чтобы обозначить число, в действительности каждая партия, вероятно, имеет длину 25-50.
* Что я сделал сейчас, так это ограничил количество открытых соединений для любого отдельного хоста, передав экземпляр соединителя в ClientSession
, то есть aiohttp.TCPConnector(limit_per_host=10)
.
** В частности, {'www.thesaurus.com', 'aiohttp.readthedocs.io', 'httpbin.org'}
, т.е. set(urllib.parse.urlsplit(u).netloc for u in urls)
.