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()
 |