天天看點

裝飾器函數監控任務的逾時響應,讓任務穩定運作

有時我們在寫代碼是,利用python的請求庫請求資料時,會有響應逾時或者響應持續沒反應的狀态,對于這種狀态需要進行監控,比如定時監控,超過設定的時間了,就傳回預設資料,進行辨別。

這次用線程類和全局變量的方式,進行逾時響應,下面對這兩個方法進行舉例:

一、線程類

定義線程函數

線程類函數,相當于多線程的方式,多線程是不能傳回值的,而線程類可以擷取傳回值,是以有線程需求的任務,可以用線程類的方式。

裝飾器函數監控任務的逾時響應,讓任務穩定運作

裝飾器函數

裝飾器部分設定子線程的方法。子線程随着主線程的退出而退出,是以主線程逾時了,就會觸發子線程的運作。

裝飾器函數監控任務的逾時響應,讓任務穩定運作

在測試函數的時候,就可以設定逾時時間和函數運作時間,進行測試。傳回結果就是出現了設定好的‘請求逾時’

裝飾器函數監控任務的逾時響應,讓任務穩定運作
裝飾器函數監控任務的逾時響應,讓任務穩定運作

二、全局變量法

由于多線程是不能擷取傳回值,那麼可以定義一個全局變量,有傳回值的時候,将傳回值指派給全局變量,通過全局變量擷取傳回值。

import time
from threading import Thread
a = None
def limit_decor(limit_time):


    def functions(func):
        # 執行操作
        def run(*params):
            thre_func = Thread(target=func, args=params)
            # 主線程結束(超出時長),則線程方法結束
            thre_func.setDaemon(True)
            thre_func.start()
            time.sleep(limit_time)
            # 最終傳回值(不論線程是否已結束)
            if a:
                return a
            else:
                return '請求逾時'
        return run


    return functions


@limit_decor(2)
def run():
    global a
    print(111)
    time.sleep(1)
    a = 2222
    return a


if __name__ == '__main__':


    print(run())      

繼續閱讀