目錄
重試次數裝飾器
前言, 最近在使用tornado框架寫Restful API時遇到很多的問題. 有框架的問題, 有異步的問題. 雖然tornado
被公認為當前python語言最好的 異步框架, 但是實際資料並沒有像 Django
, flask
框架那么豐富, 所以遇到很多的坑, 時很多! 這一篇主要是為了介紹一下其中在踩坑中所不得不使用的一些技術
.
問題: 個別API邏輯中存在很多的調用系統層面,或者調用第三方接口阻塞超時的操作, 為了確保 API在某一步是否最終調用成功(先不考慮API接口性能問題) 之前的做法是 遇到所有超時操作,都進行 for循環, 或者while循環, 直到 某一步
最終執行才會進行后續的邏輯. 但是 在測試過程中,發現
- 使用for循環並不知道到底需要執行幾次
- 使用while循環很容易造成 死循環, 最終導致程序的內存泄露, 程序崩潰.
針對不同的重試, 此時想到了 用裝飾器, 直接上代碼 如下
#!/usr/bin/env python
# ~*~ coding: utf-8 ~*~
def retry_func(retry_times=3, sleep_time=8):
"""函數重復執行次數"""
def retry_decorator(func):
@wraps(func)
def wrapper_func(*args, **kwargs):
flag = 0
while flag < retry_times:
res = func(*args, **kwargs)
if not res:
flag += 1
logger.warning("{0} execute {1} times".format((func.__name__), flag))
time.sleep(sleep_time)
continue
else:
return res
return wrapper_func
return retry_decorator
-
裝飾器的概念及基本知識這里不再做詳解: 參考 裝飾器入門到進階
-
找到 循環的條件及終止條件