1、背景
通常我們在自定義一個函式後,會呼叫這個函式來完成我們想要的功能。
就拿爬蟲來舉例,傳送請求後伺服器會在指定時間內響應(通常這個時間很短),但是有可能伺服器沒有返回任何資料。
無論是伺服器已經識別爬蟲不予返回資料亦或者是伺服器繁忙等其他原因,此時,爬蟲程式就會一直等待來自伺服器的響應。
這個時候就會非常浪費資源,甚至造成程式阻塞。
2、使用python第三方 func_timeout 模組中提供的 func_set_timeout 裝飾器可以非常簡單的設定python程式的超時時間,超時後程式丟擲 func_timeout.exceptions.FunctionTimedOut 異常。此時再用 try-except 做異常處理即可。
#coding:utf-8 from func_timeout import func_set_timeout import time @func_set_timeout(5) def timer(): for num in range(10): time.sleep(1) print(num) timer()
結果如下:
3、捕捉超時丟擲的異常
#coding:utf-8 import func_timeout from func_timeout import func_set_timeout import time @func_set_timeout(5) def timer(): for num in range(10): time.sleep(1) print(num) try: timer() except func_timeout.exceptions.FunctionTimedOut as e: print(e) print("函式執行時間超過5秒,強制結束執行")
執行結果如下:
透過裝飾器的形式捕捉異常
#coding:utf-8 import func_timeout from func_timeout import func_set_timeout, FunctionTimedOut import time def time_out(fn): def wrapper(*args,**kwargs): try: reuslt = fn(*args,**kwargs) return result except: print("函式執行時間超過5秒,強制結束執行") return wrapper @time_out @func_set_timeout(5) def timer(): for num in range(10): time.sleep(1) print(num) timer()
執行結果如下: