Умная задержка в запросах к API
Я пишу телеграм бота использующего асинхронную библиотеку aiogram. Он должен иногда посылать запросы к API. Из за ограничений это нельзя делать более чем раз в 1 раз в секунду. Я думал как можно ограничить число таких запросов. Каким образом это лучше всего реализовать.
- В методах обертки API добавить проверку на время прошлого запроса, заставив ее дополнительно хранить это время
async def get_smth(self):
.....
time_from_last_req: float = time.time() - self.last_request_time
if time_from_last_req < 1:
self.last_request_time = time.time() + 1 - time_from_last_req
await asyncio.sleep(1 - time_from_last_req)
r = await self.requester.get(URL, params)
Не вызовет ли это каких то проблем с асинхронностью, например что запросы могут "проснуться" в каком то неправильном порядке. Плюс мы создаем оч много отложеных задач, их количество может доходить то сотен (так как мы одновременно сгенерим 500 запросов, они будут выполняться "по очеверди" лягут в sleep на несколько мениут.
- Создать дополнительную асинхронную очередь, класть туда задачи на запрос к серверу, брать оттуда задачу каждую секунду и делать к ней запрос