python给函数设置超时时间_在 Linux/Mac 下为Python函数添加超时时间
我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做timeout,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常。(当然存在特殊情况timeout 会失效,请看Timeouts and cancellation for humans*[1] 这篇文章中作者的举例,我们不考虑这种特殊情况)。
但大家有没有考虑过,如何为普通的函数设置超时时间?特别是在运行一些数据处理、AI 相关的代码时,某个函数可能会运行很长时间,我们想实现,在函数运行超过特定的时间时,自动报错。
例如有这样一个场景,我写了一个函数calc_statistic(datas),根据用户传入的数据计算某个值。但如果用户传入的数据非常大,这个函数就可能运行很长时间。我想设置让这个函数最多运行10秒钟。如果10秒还没有运行完成,就报错。应该怎么办呢?
如果你的电脑操作系统是 Linux 或者 macOS,那么 可以使用 signal 来解决。
在公众号前几天的文章中,我们介绍了使用signal来接管键盘的中断信号:《一日一技:在 Python 中接管键盘中断信号》,用到的是signal.SIGINT。今天我们要用到的是signal.SIGALRM。
首先我们来看看这个信号的使用方法:
importtime
import signal
def handler(signum, _):
print('定时到!')
raise Exception('定时到了!')
def clac_statistic(datas):
time.sleep(100)
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
clac_statistic('xxx')
运行效果如下图所示:
首先绑定signal.SIGALRM事件到handler函数中,然后使用signal.alarm(10)延迟10秒发送一个信号。10秒到了以后,函数handler被运行。在函数中抛出了一个异常,导致程序结束。clac_statistic函数原本要运行100秒,但是在10秒以后就停止了,从而实现了函数的超时功能。
基于以上原理,我们实现一个装饰器,来简化为不同函数设置超时功能:
importtime
import signal
class FuncTimeoutException(Exception):
pass
def handler(signum, _):
raise FuncTimeoutException('函数定时到了!')
def func_timeout(times=0):
def decorator(func):
if nottimes:
returnfunc
def wraps(*args, **kwargs):
signal.alarm(times)
result = func(*args, **kwargs)
signal.alarm(0) # 函数提前运行完成,取消信号
returnresult
returnwraps
returndecorator
signal.signal(signal.SIGALRM, handler)
我们来试一试测试一下这个函数超时装饰器。首先测试函数的运行时间小于超时时间时,程序正常运行没有问题:
再来测试一下函数运行时间超过超时时间的情况:
正常抛出FuncTimeoutException异常。
那我们在实际使用中,可以使用try...except FuncTimeoutException捕获这个异常,然后实现自定义的处理流程,例如:
try:
clac_statistic(100)
exceptFuncTimeException:
print('该函数运行超时,运行自定义的处理流程')
import contextlib:
withcontextlib.supress(FuncTimeException):
clac_statistic(100)
【编辑推荐】
【责任编辑:华轩 TEL:(010)68476606】
点赞 0
python给函数设置超时时间_在 Linux/Mac 下为Python函数添加超时时间相关推荐
- python给函数设置超时时间_在 Linux/Mac 下为Python函数添加超时时间的方法
我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做 timeout ,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常.(当然存在特殊 ...
- Linux超时时间为0,在 Linux/Mac 下为Python函数添加超时时间
在 Linux/Mac 下为Python函数添加超时时间 收录于话题 #你不知道的 Python 71个 摄影:产品经理 产品经理亲自下厨 我们在使用 requests 这类网络请求第三方库时,可以看 ...
- 苹果系统安装python环境_如何在mac下配置python虚拟环境
安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-package 中 首先安装 1. sudo pip insta ...
- linux部署python web项目 详细_在linux服务器下部署python工程(爬虫)
---恢复内容开始--- 这两天 部署 这个 工程 ,真的是 心力交瘁惹. 如果有用到爬虫的话,python环境 先配好,如果是 python3的话 beautifulsoup 可以参见 http:/ ...
- python如何将列表去掉引号_如何将手机打造成 Python 开发利器?
相信多数安卓用户都使用过Qpython这款移动端的Python编辑器吧?之前我也研究过一阵子这个工具,但因为一次简单的爬虫让我对它失望之极.Qpython不支持lxml这个模块,然而python中lx ...
- 删除虚拟环境_手把手教你在Linux系统下使用Python虚拟环境
Hello小伙伴们,你们好,又是日常get新技能的一天,今天,咱们来整一下如何玩转Linux下Python虚拟环境,0基础入门,趁着热乎,快上车啦~. 之前小编有写过Windows下的虚拟环境创建和基 ...
- mac下的python程序使用pyinstall打包
mac下的python程序使用pyinstaller 打包注意事项 一.pyinstaller 打包特别注意事项: 注释掉程序里面的所有pirnt(),否则会会引起程序无法运行或崩溃. 二.pyins ...
- C++在linux环境下获取毫秒、微妙级别时间
C++在linux环境下获取毫秒.微妙级别时间 一.时间单位简介: 1秒 = 1000毫秒 1秒 = 1000000微秒 1秒 = 100 ...
- linux系统下对python创建的模块进行打包并发布的具体步骤
之前在前面的 Python的模块与包 文章中具体的介绍了模块,也介绍了模块创建与发布的步骤. 文章地址:https://blog.csdn.net/Mr_fengzi/article/details/ ...
最新文章
- Keil 汇编窗口无法设置断点,disassembly显示错误,Keil汇编解析错误
- Golden Software Surfer 17中文版
- 数组巧去重new Set
- c#自定义控件做漂亮的列表
- 对于一个大一计科新生,有什么代码行数在500~1000的程序(C语言)可以试着写来练手?
- 详细解读Spark的数据分析引擎:Spark SQL
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
- Oracle从非归档模式变成归档模式
- 20172324 2018-2019-1 《程序设计与数据结构》第三周学习总结
- Check Point截获JavaScript文件隐形攻击
- xmlhttp上传文件(转贴)
- sonarqube如何使用自定义规则插件
- linux定时器王贤才,《linux内核设计与实现》 学习笔记(十七)---设备和模块
- 神经网络在关系抽取中的应用
- JavaScript 学习笔记一 (入门篇)
- Enviropro EP100D-08管式土壤水分探针
- linux dos2unix
- Sublime Text3 插件 拾色器
- java路径的上一级_java路径两种写法/和\\以及 ./和../以及/之间的区别?
- tenforflow版YOLOv3下VOC数据集的准备和训练