」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用逾時取消長時間運行的 Python 函數?

如何使用逾時取消長時間運行的 Python 函數?

發佈於2024-12-23
瀏覽:963

How Can I Cancel Long-Running Python Functions Using Timeouts?

用超時取消長時間運行的函數呼叫

執行包含可能停頓函數的複雜腳本時,需要提供一種方法如果這些函數超過指定的執行時間,則終止它們。這可確保腳本不會變得無回應或無限期地卡住。

在 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