import re
import time
from collections import deque
class QueryStringResourceReleaser:
def __init__(self, max_requests, rate_limit_duration=60):
"""
Initializes the QueryStringResourceReleaser.
Args:
max_requests (int): The maximum number of allowed requests within the rate limit duration.
rate_limit_duration (int): The duration of the rate limit in seconds.
"""
self.max_requests = max_requests
self.rate_limit_duration = rate_limit_duration
self.request_queue = deque() # Queue to store request timestamps
self.lock = time.monotonic() # Lock for thread-safe access
def release_resource(self, query_string):
"""
Releases resources associated with the given query string.
Args:
query_string (str): The query string to release resources for.
"""
now = time.monotonic()
# Check if the rate limit has been exceeded
if self.is_rate_limited():
wait_time = self.calculate_wait_time()
print(f"Rate limited. Waiting {wait_time:.2f} seconds.")
time.sleep(wait_time)
self.reset_rate_limit()
self.release_resource(query_string) #retry
return
# Release resources for the query string
print(f"Releasing resources for query string: {query_string}")
# Simulate resource release (e.g., closing connections, freeing memory)
# In a real application, this would involve actual resource management.
#print(f"Resource released for {query_string}") #Added for debugging
def is_rate_limited(self):
"""
Checks if the rate limit has been exceeded.
Returns:
bool: True if the rate limit is exceeded, False otherwise.
"""
time_since_last_request = now - self.lock
if time_since_last_request < self.rate_limit_duration:
return True
else:
return False
def calculate_wait_time(self):
"""
Calculates the wait time required to satisfy the rate limit.
Returns:
float: The wait time in seconds.
"""
time_since_last_request = now - self.lock
wait_time = self.rate_limit_duration - time_since_last_request
return max(0, wait_time)
def reset_rate_limit(self):
"""
Resets the rate limit timer.
"""
self.lock = time.monotonic()
self.request_queue.clear()
if __name__ == '__main__':
# Example Usage:
releaser = QueryStringResourceReleaser(max_requests=2, rate_limit_duration=5)
for i in range(5):
query_string = f"query_{i}"
releaser.release_resource(query_string)
time.sleep(1) # Simulate requests coming in
Add your comment