30 lines
946 B
Python
30 lines
946 B
Python
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()
|