import time
from collections import deque
class TaskQueueThrottler:
def __init__(self, max_requests, interval):
"""
Initializes the throttler.
Args:
max_requests (int): The maximum number of requests allowed within the interval.
interval (float): The time interval in seconds.
"""
self.max_requests = max_requests
self.interval = interval
self.request_queue = deque() # Queue to store timestamps of requests
self.lock = time.Lock()
def is_allowed(self):
"""
Checks if a request is allowed based on the throttle.
Returns:
bool: True if the request is allowed, False otherwise.
"""
with self.lock:
now = time.time()
while self.request_queue and self.request_queue[0] <= now - self.interval:
self.request_queue.popleft() # Remove expired requests
if len(self.request_queue) < self.max_requests:
self.request_queue.append(now)
return True
else:
return False
def submit(self):
"""
Submits a request to the queue, throttling if necessary.
"""
if self.is_allowed():
# Simulate task execution (replace with your actual task)
print("Executing task...")
time.sleep(1) # Simulate task taking 1 second
else:
print("Throttled. Request denied.")
#Add timestamp to request queue for throttling
with self.lock:
self.request_queue.append(time.time())
time.sleep(self.interval) #Wait for the interval
if __name__ == '__main__':
throttler = TaskQueueThrottler(max_requests=3, interval=2) # Allow 3 requests every 2 seconds
for i in range(5):
if throttler.is_allowed():
throttler.submit()
else:
print(f"Skipping request {i}")
Add your comment