1. import datetime
  2. import time
  3. import random
  4. class RateLimiter:
  5. def __init__(self, rate=5, period=60):
  6. self.rate = rate # requests per period
  7. self.period = period # period in seconds
  8. self.tokens = rate
  9. self.last_reset = time.time()
  10. def is_allowed(self):
  11. now = time.time()
  12. if now - self.last_reset > self.period:
  13. self.tokens = self.rate
  14. self.last_reset = now
  15. if self.tokens > 0:
  16. self.tokens -= 1
  17. return True
  18. else:
  19. return False
  20. def wait(self):
  21. now = time.time()
  22. if now - self.last_reset < self.period:
  23. time.sleep(self.period - (now - self.last_reset))
  24. self.last_reset = now
  25. def encode_date(date_value, rate_limiter):
  26. """Encodes a date value with rate limiting."""
  27. if rate_limiter.is_allowed():
  28. # Simulate some processing
  29. time.sleep(random.uniform(0.01, 0.1))
  30. encoded_date = datetime.datetime.now().isoformat() # Example encoding
  31. rate_limiter.tokens -=1
  32. return encoded_date
  33. else:
  34. rate_limiter.wait() # Wait before retrying
  35. return encode_date(date_value, rate_limiter) # Retry the encoding
  36. if __name__ == '__main__':
  37. rate_limiter = RateLimiter(rate=2, period=10) # Allow 2 requests per 10 seconds
  38. date_values = [datetime.datetime.now() for _ in range(10)] #Example date values
  39. for date_value in date_values:
  40. encoded = encode_date(date_value, rate_limiter)
  41. print(f"Encoded date: {encoded}")

Add your comment