import time
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
class ArrayRequestThrottler:
def __init__(self, max_requests, interval):
self.max_requests = max_requests
self.interval = interval
self.request_count = 0
self.last_request_time = 0
self.lock = threading.Lock() # Protects shared resources
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def throttle(self):
with self.lock:
elapsed_time = time.time() - self.last_request_time
if elapsed_time < self.interval:
time.sleep(self.interval - elapsed_time)
self.last_request_time = time.time()
self.request_count += 1
if self.request_count >= self.max_requests:
logging.warning(f"Throttling: Max requests ({self.max_requests}) reached. Pausing.")
time.sleep(self.interval) #Pause if max requests reached
self.request_count = 0 #Reset counter
self.last_request_time = time.time()
logging.info("Throttling reset")
def request_array(self, array):
self.throttle()
logging.info(f"Processing array: {array}")
# Simulate array processing
time.sleep(0.1)
logging.info(f"Finished processing array: {array}")
import threading
if __name__ == '__main__':
max_requests = 5
interval = 2 # seconds
throttler = ArrayRequestThrottler(max_requests, interval)
arrays = [list(range(10)), list(range(11)), list(range(12)), list(range(13)), list(range(14)), list(range(15)), list(range(16))]
for arr in arrays:
with throttler:
throttler.request_array(arr)
Add your comment