1. import re
  2. import time
  3. from collections import deque
  4. class QueryStringResourceReleaser:
  5. def __init__(self, max_requests, rate_limit_duration=60):
  6. """
  7. Initializes the QueryStringResourceReleaser.
  8. Args:
  9. max_requests (int): The maximum number of allowed requests within the rate limit duration.
  10. rate_limit_duration (int): The duration of the rate limit in seconds.
  11. """
  12. self.max_requests = max_requests
  13. self.rate_limit_duration = rate_limit_duration
  14. self.request_queue = deque() # Queue to store request timestamps
  15. self.lock = time.monotonic() # Lock for thread-safe access
  16. def release_resource(self, query_string):
  17. """
  18. Releases resources associated with the given query string.
  19. Args:
  20. query_string (str): The query string to release resources for.
  21. """
  22. now = time.monotonic()
  23. # Check if the rate limit has been exceeded
  24. if self.is_rate_limited():
  25. wait_time = self.calculate_wait_time()
  26. print(f"Rate limited. Waiting {wait_time:.2f} seconds.")
  27. time.sleep(wait_time)
  28. self.reset_rate_limit()
  29. self.release_resource(query_string) #retry
  30. return
  31. # Release resources for the query string
  32. print(f"Releasing resources for query string: {query_string}")
  33. # Simulate resource release (e.g., closing connections, freeing memory)
  34. # In a real application, this would involve actual resource management.
  35. #print(f"Resource released for {query_string}") #Added for debugging
  36. def is_rate_limited(self):
  37. """
  38. Checks if the rate limit has been exceeded.
  39. Returns:
  40. bool: True if the rate limit is exceeded, False otherwise.
  41. """
  42. time_since_last_request = now - self.lock
  43. if time_since_last_request < self.rate_limit_duration:
  44. return True
  45. else:
  46. return False
  47. def calculate_wait_time(self):
  48. """
  49. Calculates the wait time required to satisfy the rate limit.
  50. Returns:
  51. float: The wait time in seconds.
  52. """
  53. time_since_last_request = now - self.lock
  54. wait_time = self.rate_limit_duration - time_since_last_request
  55. return max(0, wait_time)
  56. def reset_rate_limit(self):
  57. """
  58. Resets the rate limit timer.
  59. """
  60. self.lock = time.monotonic()
  61. self.request_queue.clear()
  62. if __name__ == '__main__':
  63. # Example Usage:
  64. releaser = QueryStringResourceReleaser(max_requests=2, rate_limit_duration=5)
  65. for i in range(5):
  66. query_string = f"query_{i}"
  67. releaser.release_resource(query_string)
  68. time.sleep(1) # Simulate requests coming in

Add your comment