aiohttp: установить максимальное количество запросов в секунду
Как я могу установить максимальное количество запросов в секунду (ограничить их) на стороне клиента с помощью aiohttp?
2 ответов
Я нашел здесь одно возможное решение:http://compiletoi.net/fast-scraping-in-python-with-asyncio.html
выполнение 3 запросов в то же время круто, делая 5000, однако, не так приятно. Если вы попытаетесь сделать слишком много запросов одновременно, соединения могут начать закрываться, или вы даже можете получить запрет на веб-сайте.
чтобы избежать этого, вы можете использовать семафор. Это инструмент синхронизации, который можно использовать для ограничения количество сопрограммы, что делать что-то в какой-то момент. Мы просто создадим семафор перед созданием цикла, передавая в качестве аргумента количество одновременных запросов, которые мы хотим разрешить:
sem = asyncio.Semaphore(5)
тогда мы просто заменим:
page = yield from get(url, compress=True)
тем же самым, но защищена семафором:
with (yield from sem):
page = yield from get(url, compress=True)
Это гарантирует, что не более 5 запросов могут быть выполнены одновременно.
С V2.0, при использовании ClientSession
, aiohttp
автоматически ограничивает количество одновременных подключений до 100.
вы можете изменить ограничение, создав свой собственный TCPConnector
и передать его в ClientSession
. Например, для создания клиента, ограниченного 50 одновременными запросами:
import aiohttp
connector = aiohttp.TCPConnector(limit=50)
client = aiohttp.ClientSession(connector=connector)
в случае, если он лучше всего подходит для вашего случая использования, есть также limit_per_host
параметр (который выключен по умолчанию), который вы можете передать в limit количество одновременных подключений к одной и той же"конечной точке". В документах:
limit_per_host
(int
) - ограничение для одновременных подключений к одной и той же конечной точке. Конечные точки одинаковы, если они равны(host, port, is_ssl)
тройной.
пример использования:
import aiohttp
connector = aiohttp.TCPConnector(limit_per_host=50)
client = aiohttp.ClientSession(connector=connector)