5
Q
速率限制蟒蛇裝飾
A
回答
7
您可以使用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
相關問題
- 1. 蟒蛇定義與裝飾
- 2. __setattr__類裝飾蟒蛇
- 3. 用JavaScript蟒蛇裝飾
- 4. 蟒蛇裝飾爲對象
- 5. 發現裝飾蟒蛇
- 6. 蟒蛇:裝飾模塊
- 7. 蟒蛇裝飾參數
- 8. 限制蟒蛇
- 9. 解析蟒蛇作爲裝飾
- 10. 蟒蛇裝飾失去參數定義
- 11. 蟒蛇 - 裝飾一個發電機
- 12. 蟒蛇寫一個裝飾用
- 13. 蟒蛇__getattribute__覆蓋和@property裝飾
- 14. 蟒蛇裝飾和靜態方法
- 15. 蟒蛇多個裝飾更改參數
- 16. 蟒蛇限制itertools導致
- 17. 裝飾模式裝飾器限制
- 18. 蟒@abstractmethod裝飾
- 19. 繪製隨機界蟒蛇斜率
- 20. 哪裏蟒蛇裝飾從裝飾的功能獲得的參數
- 21. 速率限制如何限制API
- 22. 速率限制算法限制請求
- 23. 分佈式速率限制
- 24. OkHttp API速率限制
- 25. Ggmap「dsk」速率限制
- 26. Twitter隨機速率限制
- 27. 速率限制GET請求
- 28. Nginx:動態速率限制
- 29. Twitter的速率限制
- 30. Twitter API速率限制
如果包裝函數拋出異常,這將不會釋放信號量。你可以使用'try..finally'子句來確保發生。 –
@PaulMFurley很好的接收!我編輯了代碼,你會檢查它嗎? –