Rate Limiting with Python and Redis (GitHub)
import time
from client import get_redis_client from exceptions import RateLimitExceeded def rate_per_second(count): def _rate_per_second(function): def __rate_per_second(*args, **kwargs): client = get_redis_client() key = f“rate-limit:{int(time.time())}“ if int(client.incr(key)) > count: raise RateLimitExceeded if client.ttl(key) == –1: # timeout is not set client.expire(key, 1) # expire in 1 second return function(*args, *kwargs) return __rate_per_second return _rate_per_second @rate_per_second(100) # example: 100 requests per second def my_function(): pass # do something if __name__ == ‘__main__‘: success = fail = 0 for i in range(2000): try: my_function() success += 1 except RateLimitExceeded: fail += 1 time.sleep(5/1000) # sleep every 5 milliseconds print(f“Success count = {success}“) print(f“Fail count = {fail}“)