Как работать с aiohttp и ограничением скорости?Python

Программы на Python
Ответить
Anonymous
 Как работать с aiohttp и ограничением скорости?

Сообщение Anonymous »

На этой неделе я начал изучать Python, и в качестве первого проекта я решил разработать простое приложение, которое будет получать данные из API Riot, обрабатывать их и затем вставлять в базу данных MySQL. Мне удалось заставить его работать синхронно без проблем, чего уже достаточно для проекта, так как API имеет ограничение скорости 20 вызовов в секунду и 100 вызовов за 120 секунд, а через 40 секунд предел скорости уже был достигнут.
Однако я хотел его улучшить, так как есть возможность получить более качественные ключи, которые обеспечивают ограничение скорости намного выше того, которое я подключил.
Я пытался обойти это многопоточность, путем настройки исполнителя потока с 5 рабочими процессами, каждый из которых будет выполнять выборку для каждого совпадения, получать соединение из пула, вставлять данные в БД, а затем получать следующее доступное совпадение для извлечения, но этот подход не выглядел многообещающим, поскольку он вставлял несколько раз небольшие фрагменты данных.
Мой код работал с одной функцией выборки, которая получала URL-адрес, сгенерированный из других функций, структура кода была примерно такой:

Код: Выделить всё

def fetch(url):
while True:
response = session.get(url, headers={"X-Riot-Token": f"{api_key}"})
if response.status_code == 200:
return response.json()
elif response.status_code == 429:
retry_after = int(response.headers.get("Retry-After", 1))
time.sleep(retry_after+1)
else:
return None
Структура почти такая же, с попыткой, за исключением цикла while.
Цикл while предотвращал выполнение запроса. Если он получил запрос на ограничение скорости, он будет ждать только до истечения тайм-аута.
При многопоточности это сработало, я также добавил повторную попытку после как глобальную и проверил, ограничена ли скорость перед выполнением запроса, но он был недостаточно быстрым и все равно выполнял некоторые запросы после ограничения скорости. началось, что может привести к черному списку этого API.
Я пробовал с asyncio и aiohttp, и это было намного быстрее, но были достигнуты как 20 запросов в секунду, так и 100 на 120, и запросы продолжали выполняться.
Я видел о семафорах, но не совсем хорошо понимал, как это будет работать, должен ли я создать два семафора, по одному для каждого ограничения скорости, получить каждый из запросов, выполнить asyncio.sleep, а затем соответственно освободить их? Будут ли еще выполняться следующие запросы? Я видел здесь другие сообщения, однако ни в одном из них не рассказывалось, как работать с двумя разными ограничениями скорости.
Базовая структура будет такой:
Запрос синхронизации для получения списка матчей -> асинхронный запрос для каждого матча для получения соответствующих данных -> асинхронный запрос для получения информации о каждом игроке матча -> вставить все в базу данных после обработки.

Подробнее здесь: https://stackoverflow.com/questions/782 ... e-limiting
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»