import asyncio from datetime import datetime class BatchLimiter: def __init__(self, max_requests, period): self.max_requests = max_requests self.period = period self.current_requests = 0 self.start_time = None self.lock = asyncio.Lock() async def acquire(self): async with self.lock: if self.current_requests == 0: self.start_time = datetime.now() if self.current_requests < self.max_requests: self.current_requests += 1 return elapsed_time = (datetime.now() - self.start_time).total_seconds() if elapsed_time < self.period: await asyncio.sleep(self.period - elapsed_time) self.current_requests = 1 self.start_time = datetime.now() else: self.current_requests = 1 self.start_time = datetime.now()