Asyncio — как ограничить количество запросов в 1 секунду?

#python #api #asynchronous #python-asyncio #aiohttp

Вопрос:

Я новичок в asyncio, пытаюсь выполнять асинхронные вызовы API, но когда я отправляю более 1 запроса в секунду, API отвечает кодом состояния 429 — слишком много запросов… Согласно документации API, я должен делать только 1 req/сек.

Не могу понять, как сделать только 1 запрос в секунду для этого кода:

 #Call to API
async def ps_request_marshal(converted_urls, device_input):
    global device_settings, data, tasks
    data = []
    device_settings = device_input
    tasks = []
    url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={}' 'amp;key= key amp;strategy='  device_input

    async with aiohttp.ClientSession() as session:
        for page in converted_urls:
            tasks.append(asyncio.create_task(session.get(url.format(page), ssl=False)))
        responses = await asyncio.gather(*tasks)
        for response in responses:
            data.append(await response.json())
        print(responses)
 

Буду очень признателен за вашу помощь!

Ответ №1:

Решено, просто добавил «ожидание asyncio.sleep(запрос delay_per)» в цикл создания задачи.

 async def ps_request_marshal(converted_urls, device_input):
    global device_settings, data, tasks
    data = []
    device_settings = device_input
    tasks = []
    url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={}' 'amp;key=key='  device_input
    delay_per_request = 1
    async with aiohttp.ClientSession() as session:
        for page in converted_urls:
            tasks.append(asyncio.create_task(session.get(url.format(page), ssl=False)))
            await asyncio.sleep(delay_per_request)
        responses = await asyncio.gather(*tasks)
        print(responses)
        for response in responses:
            data.append(await response.json())
        print(responses)