Ограничивающий скорость python decorator


Я нашел Этот ограничивающий скорость Python decorator, основанный на классах redis. Как я могу написать подобный декоратор, который использует только то, что доступно в стандартной библиотеке, которую можно использовать следующим образом?

def ratelimit(limit, every):
    # 
1 5

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