123
This commit is contained in:
1
limiter/__init__.py
Normal file
1
limiter/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .batch_limiter import BatchLimiter
|
||||
29
limiter/batch_limiter.py
Normal file
29
limiter/batch_limiter.py
Normal file
@@ -0,0 +1,29 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user