Как сделать паузу в 1с между асинхронными запросами?
Я использую апи одного сайта, в бесплатной версии у меня ограничение 1 запрос в секунду.
Функция которая выполняет асинхронный запрос к данному апи внедрина в работу бота написанного на aiogram.
Суть вопроса, как поставить ограничение или как предерживаться ограничения в 1 запрос в секунду учитывая что aiogram в данном случаи можно приравнять к asyncio.gather(), то есть просто и банально поставить паузу await asyncio.sleep(1) не сработает, та и больше скажу в обычном тесте в поочередном вызове функции с паузой asyncio.sleep(1) почему то код работал на 6-7 запросе быстрее чем раз в 1с (без понятия как, но я ловил ошибку 429). Также я пробовал установить и таймаут с помощью aiohttp.ClientTimeout(total=1), но это также безуспешно так как в итоге никакой паузы в 1 секунду я не увидел.
import aiohttp
import asyncio
import time
async def get_time_zone(lat, lon):
url = f""
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
print(await response.text(), response.status)
async def main():
lat = 37.7749
lon = -122.4194
start = time.time()
for _ in range(10):
await get_time_zone(lat, lon)
await asyncio.sleep(1)
print("time: ", time.time()-start)
asyncio.run(main())
ну так не делай тупо gather, а делай один обычный цикл (или очередь), внутри которого запрос к сайту и asyncio.sleep(1) после него
я же сказал что эта функция находиться в асинхронном боте и можно считать что тоже самое что и asyncio.gather(). Можно конечно создавать дополнительный поток, но я в коде не хотел смешивать асинхронность и синхронность, или же вы имели виду создание асинхронной задачи?
Maxwell012, не нужно создавать поток, я про такое даже не писал, нужно сразу создать одну задачу, в которой будет цикл, а лучше слушание очереди, и в которую все будут передавать запросы, это одна задача и будет их выполнять с задержкой в 1 после каждого запроса.
Еще ты привел код, в котором нет проблемы, которую ты описал.