python functools.wraps 實現超時重試的閉包

這是以前碰到的筆試題,當時比較緊張,腦子轉不過來,可能很多面試者都有這種經歷。現在看書時又看到這個方法,想到了之前那道面試題,簡單實現

import time
from functools import wraps

def retry(timeout=0, try_count=0):
    """
    :param timeout: 超時時間
    :param try_count: 重試次數
    :return:
    """
    def wrapper(func):
        @wraps(func)
        def inner(*args, **kwargs):
            m = 0
            while m <= try_count:
                try:
                    start = time.time()
                    res = func(*args, **kwargs)
                    end = time.time()
                    if end-start < timeout:
                        return res
                    else:
                        print("超時")
                        return
                except Exception as e:
                    time.sleep(1)
                    m += 1
                    print("error: {}".format(e))

            if m > try_count:
                print("重試次數太多")
        return inner
    return wrapper


@retry(3, 3)
def hi():
    # 測試超時時間
    # time.sleep(3)
    # return (2/2)
    # 測試重試
    print(1/0)


res = hi()
if res:
    print(res)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章