python 行程超時自動退出 裝飾器
為啥寫這個裝飾器
之前做用例測驗的時候,單行程測驗,發現有些用例執行時間特別長,卡死,影響下面用例的執行,剛開始在主函式內添加了超時退出,但是感覺用的不方便,雖然也能實作功能,但是主函式變得特別累贅,所以還是選擇寫一個裝飾器,
思路
利用python的多執行緒一個執行緒控制主行程運行時間,時間到則利用執行緒os._exit()迫使主行程退出,另一個執行緒呼叫主行程函式執行腳本,
代碼
from functools import wraps
import time
import os
from threading import Thread
def set_time_limit(t):
def auto_quit(t1):
'''此為控制行程超時退出的執行緒函式'''
time.sleep(t1)
print("time out {}".format(t1))
os._exit(1) #此函式專門用于執行緒控制主行程退出,有興趣的可以看一下和sys.exit()的區別
def decorator(f):
'''此函式用于傳入被裝飾函式f'''
@wraps(f)
def wrapper(*args,**kwargs):
'''裝飾器內部遵循的邏輯是:
1.auto_quit先執行完,行程結束
2.被修飾函式f先執行完,auto_quit函式停止執行
3.被修飾函式執行完,下面的代碼才能運行
'''
t1=Thread(target=auto_quit,args=(t,)) #此處的t是set_time_limit函式的形參,是auto_quit函式的實參
t2=Thread(target=f,args=args,kwargs=kwargs)
t1.setDaemon(True) #滿足第2點
t1.start()
t2.start()
t2.join() #滿足第3點
return wrapper
return decorator
測驗代碼
設定超時時間為3s,主函式執行時間為2s
@set_time_limit(3)
def a(t):
time.sleep(t)
print("execuate finished")
if __name__=="__main__":
a(2)
print("執行完畢")
執行完結果
執行完成,auto_quit函式沒有呼叫

測驗代碼
設定超時時間為2s,主函式執行時間為3s
@set_time_limit(2)
def a(t):
time.sleep(t)
print("execuate finished")
if __name__=="__main__":
a(3)
print("執行完畢")
執行結果
追行程超時退出

你們也可以把t1.setDaemon(True)注釋掉(超時時間設長一些,執行時間短一些)執行一下看一下這樣就會理解啥是守護執行緒
你會發現執行一直不結束,在等待auto_quit執行結束
你們也可以把t2.join()注釋掉
會發現無論程式是否超時退出都先列印:執行完畢
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/20049.html
標籤:其他
