1. import time
  2. import logging
  3. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
  4. class ArrayRequestThrottler:
  5. def __init__(self, max_requests, interval):
  6. self.max_requests = max_requests
  7. self.interval = interval
  8. self.request_count = 0
  9. self.last_request_time = 0
  10. self.lock = threading.Lock() # Protects shared resources
  11. def __enter__(self):
  12. return self
  13. def __exit__(self, exc_type, exc_val, exc_tb):
  14. pass
  15. def throttle(self):
  16. with self.lock:
  17. elapsed_time = time.time() - self.last_request_time
  18. if elapsed_time < self.interval:
  19. time.sleep(self.interval - elapsed_time)
  20. self.last_request_time = time.time()
  21. self.request_count += 1
  22. if self.request_count >= self.max_requests:
  23. logging.warning(f"Throttling: Max requests ({self.max_requests}) reached. Pausing.")
  24. time.sleep(self.interval) #Pause if max requests reached
  25. self.request_count = 0 #Reset counter
  26. self.last_request_time = time.time()
  27. logging.info("Throttling reset")
  28. def request_array(self, array):
  29. self.throttle()
  30. logging.info(f"Processing array: {array}")
  31. # Simulate array processing
  32. time.sleep(0.1)
  33. logging.info(f"Finished processing array: {array}")
  34. import threading
  35. if __name__ == '__main__':
  36. max_requests = 5
  37. interval = 2 # seconds
  38. throttler = ArrayRequestThrottler(max_requests, interval)
  39. arrays = [list(range(10)), list(range(11)), list(range(12)), list(range(13)), list(range(14)), list(range(15)), list(range(16))]
  40. for arr in arrays:
  41. with throttler:
  42. throttler.request_array(arr)

Add your comment