enr*_*cis 6 python algorithm decorator rate-limiting python-decorators
我发现这个基于redis类的限速python装饰器.我怎样才能编写一个类似的装饰器,它只使用标准库中可用的内容,如下所示?
def ratelimit(limit, every):
# python magic
@ratelimit(limit=1, every=2)
def printlimited(x):
print x
# print one number every two seconds
for x in range(10):
printlimited(x)
Run Code Online (Sandbox Code Playgroud)
stackoverflow 还有其他答案,但它们不允许指定分母.
enr*_*cis 10
您可以使用a 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
Run Code Online (Sandbox Code Playgroud)