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)