Ограничивающий скорость python decorator
Я нашел Этот ограничивающий скорость Python decorator, основанный на классах redis. Как я могу написать подобный декоратор, который использует только то, что доступно в стандартной библиотеке, которую можно использовать следующим образом?
def ratelimit(limit, every):
#
1 ответ:
Вы можете использовать
threading.Semaphore
для подсчета и блокирования запросов, превышающих лимит, в сочетании сthreading.Timer
чтобы запланировать функцию, которая освобождает семафор.from threading import Semaphore, Timer from functools import wraps def ratelimit(limit, every): def limitdecorator(fn): semaphore = Semaphore(limit) @wraps(fn) def wrapper(*args, **kwargs): semaphore.acquire() try: return fn(*args, **kwargs) finally: # don't catch but ensure semaphore release timer = Timer(every, semaphore.release) timer.setDaemon(True) # allows the timer to be canceled on exit timer.start() return wrapper return limitdecorator