「Python實用祕技02」給Python函式定“鬧鐘”

費弗裡發表於2021-12-11

本文完整示例程式碼及檔案已上傳至我的Github倉庫https://github.com/CNFeffery/PythonPracticalSkills

  這是我的系列文章「Python實用祕技」的第2期,本系列立足於筆者日常工作中使用Python輔助辦公的心得體會,每一期為大家帶來一個3分鐘即可學會的簡單小技巧。

  作為系列第2期,我們即將學習的是:為Python函式新增執行超時檢查功能

「Python實用祕技02」給Python函式定“鬧鐘”

  某些常用的庫如requestsget()函式,具有特定的引數timeout,設定後可以在其執行超過一定時間還沒執行完成時丟擲超時錯誤

  而如果我們想為自定義函式也新增類似的“鬧鐘”超時檢查功能,最簡單的方式是使用第三方庫wrapt_timeout_decorator中的timeout()裝飾器,通過引數傳遞超時時長(單位:秒)即可,下面是一個簡單的例子:

from wrapt_timeout_decorator import timeout


@timeout(5) # 設定超時時長為5秒
def demo_func(seconds: float) -> float:
    # 此處time在函式中匯入是為了繞開jupyter中wrapt_timeout_decorator與time模組的特殊錯誤
    # 詳見https://github.com/bitranox/wrapt_timeout_decorator/issues/24
    import time 
    time.sleep(seconds)
    
    return seconds

# 未超時時正常執行
demo_func(3)

# 超時報錯
demo_func(6)
「Python實用祕技02」給Python函式定“鬧鐘”

  並且不只是函式,類中的靜態方法亦可使用:

class Demo:
    
    @timeout(5) # 設定超時時長為5秒
    @staticmethod
    def demo_func(seconds: float) -> float:
        # 此處time在函式中匯入是為了繞開jupyter中wrapt_timeout_decorator與time模組的特殊錯誤
        # 詳見https://github.com/bitranox/wrapt_timeout_decorator/issues/24
        import time 
        time.sleep(seconds)

        return seconds
    
demo = Demo()
demo.demo_func(3)

Demo().demo_func(6)
「Python實用祕技02」給Python函式定“鬧鐘”

  使用場景非常之多,譬如前不久筆者就用它來解決fabric模擬執行nohup命令時的持續阻塞問題。


  本期分享結束,我們們下回見~?

相關文章