Python程序运行中,可能会遇到各种超时异常的情况,那么处理这部分异常就是处理此类异常的直接需求,本文记录相关内容。
超时异常 {#超时异常}
- 程序由于种种原因运行了异常多的时间,甚至死循环
- 处理此类问题的思路有新建线程和使用 signal 两种思路
- signal 对 Windows 支持很有限,在Linux下运行良好
- 常用的工具包有:timeout-decorator,func_timeout,stopit
- 解决问题的框架都是为需要计时的函数添加装饰器,在装饰器中使用线程或信号量技术控制运行时间
signal {#signal}
python 自带的 信号量
可以作为计时装置参与超时异常检测,支持 Linux ,Windows 支持不佳
示例代码 {#示例代码}
-
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
异常作为超时异常 -
装饰器的参数在编译过程中确定,如果需要作为参数传入可以按照如下步骤进行:
- 在装饰器参数中设置
allowOverride=True
- 在被装饰的函数中加入关键词参数
**kwargs
- 增加输入参数
forceTimeout
,以覆盖装饰器中的超时参数
- 在装饰器参数中设置
示例代码 {#示例代码-3}
基础示例 {#基础示例}
在 Windows 和 Linux 下输出相同:
进阶示例 {#进阶示例}
装饰类方法,同时动态配置计时时间,捕捉超时异常
在 Windows 和 Linux 下输出相同:
stopit {#stopit}
安装 {#安装-3}
使用方法 {#使用方法-3}
-
引入包
-
将装饰器装饰在需要控制时间的函数上,参数单位为秒,可以装饰类成员函数
-
在被装饰的函数中输入参数
timeout
来控制时长,异常可以用Exception
捕获
示例代码 {#示例代码-4}
在 Windows 和 Linux 下输出相同:
参考资料 {#参考资料}
- https://www.cnblogs.com/haoxr/p/8757985.html
- https://www.jianshu.com/p/ae8a2dffe06b
- https://www.cnblogs.com/lucky-heng/p/10921980.html
文章链接:
https://www.zywvvd.com/notes/coding/python/python-timeout/python-timeout/