用超時取消長時間運行的函數呼叫
執行包含可能停頓函數的複雜腳本時,需要提供一種方法如果這些函數超過指定的執行時間,則終止它們。這可確保腳本不會變得無回應或無限期地卡住。
在 Python 中,利用訊號包(在 UNIX 系統上可用)為該問題提供了解決方案。透過註冊訊號處理程序,您可以設定函數呼叫的逾時。如果函數花費的時間超過指定的時間,則會呼叫處理程序,從而允許您適當地處理情況。
考慮以下程式碼片段:
import signal # Register a signal handler for the timeout def handler(signum, frame): print("Forever is over!") raise Exception("end of time") # Define a function that may run for an indetermined time def loop_forever(): import time while 1: print("sec") time.sleep(1) # Register the signal function handler signal.signal(signal.SIGALRM, handler) # Define a timeout for the function signal.alarm(10) try: loop_forever() except Exception as exc: print(exc) # Cancel the timer if the function returned before timeout signal.alarm(0)
在這個例子中,我們註冊了處理函數來處理超時訊號。然後,我們定義長時間運行的loop_forever函數,該函數每秒連續列印訊息「sec」。
使用signal.alarm(10)設定10秒超時後,我們嘗試執行loop_forever。如果函數執行時間超過 10 秒,我們的訊號處理程序就會被調用,並列印“Forever is over!”並引發異常。
為了確保正確處理逾時場景,如果函數在指定時間之前返回,則必須取消計時器。在我們的範例中,我們在引發異常時呼叫 signal.alarm(0) 來取消計時器。
請注意,訊號包可能無法與多執行緒環境良好互動。此外,如果函數捕獲並忽略超時期間引發的異常,則超時機制可能無效。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3