對于執行某些語句時,擔心執行時間過長,于是需要設置最長執行時間,超時即退出,這里提出三種方案:
Window下
1.eventlet
pip install eventlet
安裝相關模塊后,即可使用,沒有系統限制,舉例:
import eventlet
import time
eventlet.monkey_patch()
#添加補丁
with eventlet.Timeout(2,False):
#最多執行時間為2s
print(1)
time.sleep(1.5)
print(2)
time.sleep(1)
print(3)
print(4)
結果為:
1
2
4
可以看到with里的最后一個print因為超出2秒限制而沒有輸出
更多參考
https://www.cnblogs.com/Security-Darren/p/4170031.html
Linux下
2.signal
通過signal模塊信號機制來控制語句執行時間,缺點是windows下信號機制不夠完善,因而只能在linux、unix這類系統下使用,舉例:
import time
import signal
def abc():
#最多執行時間為2s
print(1)
time.sleep(1.5)
print(2)
time.sleep(1)
print(3)
#超時的回調函數
def myHandler(signum, frame):
print("執行超時")
exit()
signal.signal(signal.SIGALRM, myHandler)
#定時2秒,超時則執行回調函數
signal.alarm(2)
abc()
print(4)
結果為:
1
2
執行超時
上面的是程序整體執行時間控制,所以超時后不論語句在哪都不會執行
更多參考:
https://blog.csdn.net/imnisen1992/article/details/53192389
https://blog.csdn.net/jinixin/article/details/80383177?utm_source=blogxgwz4
http://www.lxweimin.com/p/c8edab99173d
https://blog.csdn.net/zelinhehe/article/details/77529844
3.timeout-decorator
pip install time-decorator
安裝相關模塊后,即可直接調用裝飾器使用,超時即報錯,可以捕捉異常處理,但也基于信號機制,無法在windows下使用,舉例:
import time
import timeout_decorator
@timeout_decorator.timeout(2)
def abc():
#最多執行時間為2s
print(1)
time.sleep(1.5)
print(2)
time.sleep(1)
print(3)
try:
abc()
except:
pass
print(4)
結果為:
1
2
4
更多參考
http://www.lxweimin.com/p/a7fc98c7af4d
https://www.cnblogs.com/fengmk2/archive/2008/08/30/python_tips_timeout_decorator.html