51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Python - 函数超时异常处理

Python程序运行中,可能会遇到各种超时异常的情况,那么处理这部分异常就是处理此类异常的直接需求,本文记录相关内容。

超时异常 {#超时异常}

  • 程序由于种种原因运行了异常多的时间,甚至死循环
  • 处理此类问题的思路有新建线程和使用 signal 两种思路
  • signal 对 Windows 支持很有限,在Linux下运行良好
  • 常用的工具包有:timeout-decoratorfunc_timeoutstopit
  • 解决问题的框架都是为需要计时的函数添加装饰器,在装饰器中使用线程或信号量技术控制运行时间

signal {#signal}

python 自带的 信号量 可以作为计时装置参与超时异常检测,支持 LinuxWindows 支持不佳

示例代码 {#示例代码}

  • Linux下 输出

    超时的函数被叫停并抛出异常,没有超时的函数正常执行

  • Windows 下

    无法正常使用

timeout-decorator {#timeout-decorator}

一个处理超时的装饰器,只需要在你想要的函数前面加上这个装饰器,就可以设置超时时间,如果超过了容忍的超时时间,那么程序将抛异常。

默认工作原理为 signal,因此Linux支持更好Windows支持不佳

安装 {#安装}

使用方法 {#使用方法}

  • 引入包

  • 将装饰器装饰在需要控制时间的函数上,参数单位为秒

示例代码 {#示例代码-2}

  • Linux 下输出
  • Windows 下输出

    表明使用了信号量,并且在Windows 下支持不好

    timeout函数参数定义

    也就是可以将 use_signals 设置为 false,设置后在Windows 下仍然无法运行,Linux仍然运行正常。

func_timeout (推荐) {#func-timeout-(推荐)}

基于线程技术的函数工作计时器,可以很好地兼容 Linux, Windows

可以装饰类函数,可以在被装饰函数中动态设置超时时间

安装 {#安装-2}

使用方法 {#使用方法-2}

  • 引入包

  • 将装饰器装饰在需要控制时间的函数上,参数单位为秒,可以装饰类成员函数

  • 需要说明的是,该装饰器产生的异常种类不会被 except Exception as e 捕捉, 需要捕捉包内的 FunctionTimedOut 异常作为超时异常

  • 装饰器的参数在编译过程中确定,如果需要作为参数传入可以按照如下步骤进行:

    1. 在装饰器参数中设置 allowOverride=True
    2. 在被装饰的函数中加入关键词参数 **kwargs
    3. 增加输入参数forceTimeout,以覆盖装饰器中的超时参数

示例代码 {#示例代码-3}

基础示例 {#基础示例}

在 Windows 和 Linux 下输出相同:

进阶示例 {#进阶示例}

装饰类方法,同时动态配置计时时间,捕捉超时异常

在 Windows 和 Linux 下输出相同:

stopit {#stopit}

安装 {#安装-3}

使用方法 {#使用方法-3}

  • 引入包

  • 将装饰器装饰在需要控制时间的函数上,参数单位为秒,可以装饰类成员函数

  • 在被装饰的函数中输入参数 timeout 来控制时长,异常可以用 Exception 捕获

示例代码 {#示例代码-4}

在 Windows 和 Linux 下输出相同:

参考资料 {#参考资料}



文章链接:
https://www.zywvvd.com/notes/coding/python/python-timeout/python-timeout/

赞(0)
未经允许不得转载:工具盒子 » Python - 函数超时异常处理