在 Linux/Mac 下为Python函数添加超时时间的方法


Posted in Python onFebruary 20, 2020

我们在使用 requests 这类网络请求第三方库时,可以看到它有一个参数叫做 timeout ,就是指在网络请求发出开始计算,如果超过 timeout 还没有收到返回,就抛出超时异常。(当然存在特殊情况timeout 会失效,请看Timeouts and cancellation for humans* 这篇文章中作者的举例,我们不考虑这种特殊情况)。

但大家有没有考虑过,如何为普通的函数设置超时时间?特别是在运行一些数据处理、AI 相关的代码时,某个函数可能会运行很长时间,我们想实现,在函数运行超过特定的时间时,自动报错。

例如有这样一个场景,我写了一个函数 calc_statistic(datas) ,根据用户传入的数据计算某个值。但如果用户传入的数据非常大,这个函数就可能运行很长时间。我想设置让这个函数最多运行10秒钟。如果10秒还没有运行完成,就报错。应该怎么办呢?

如果你的电脑操作系统是 Linux 或者 macOS,那么 可以使用 signal 来解决。

在公众号前几天的文章中,我们介绍了使用signal来接管键盘的中断信号,用到的是 signal.SIGINT 。今天我们要用到的是 signal.SIGALRM

首先我们来看看这个信号的使用方法:

import time
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')

运行效果如下图所示:

在 Linux/Mac 下为Python函数添加超时时间的方法

首先绑定 signal.SIGALRM 事件到 handler 函数中,然后使用 signal.alarm(10) 延迟10秒发送一个信号。10秒到了以后,函数 handler 被运行。在函数中抛出了一个异常,导致程序结束。 clac_statistic 函数原本要运行100秒,但是在10秒以后就停止了,从而实现了函数的超时功能。

基于以上原理,我们实现一个装饰器,来简化为不同函数设置超时功能:

import time
import signal
class FuncTimeoutException(Exception):
  pass
def handler(signum, _):
  raise FuncTimeoutException('函数定时到了!')
def func_timeout(times=0):
  def decorator(func):
    if not times:
      return func
    def wraps(*args, **kwargs):
      signal.alarm(times)
      result = func(*args, **kwargs)
      signal.alarm(0) # 函数提前运行完成,取消信号
      return result
    return wraps
  return decorator
signal.signal(signal.SIGALRM, handler)

我们来试一试测试一下这个函数超时装饰器。首先测试函数的运行时间小于超时时间时,程序正常运行没有问题:

在 Linux/Mac 下为Python函数添加超时时间的方法

再来测试一下函数运行时间超过超时时间的情况:

在 Linux/Mac 下为Python函数添加超时时间的方法

正常抛出 FuncTimeoutException 异常。

那我们在实际使用中,可以使用 try...except FuncTimeoutException 捕获这个异常,然后实现自定义的处理流程,例如:

try:
  clac_statistic(100)
except FuncTimeException:
  print('该函数运行超时,运行自定义的处理流程')

当然你如果想直接跳过这个异常也没问题:

import contextlib:
with contextlib.supress(FuncTimeException):
  clac_statistic(100)

总结

以上所述是小编给大家介绍的在 Linux/Mac 下为Python函数添加超时时间的方法,希望对大家有所帮助,也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python threading模块操作多线程介绍
Apr 08 Python
Python smallseg分词用法实例分析
May 28 Python
Python实现曲线点抽稀算法的示例
Oct 12 Python
vscode 远程调试python的方法
Dec 01 Python
Python中装饰器高级用法详解
Dec 25 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
Python+selenium点击网页上指定坐标的实例
Jul 05 Python
python scipy卷积运算的实现方法
Sep 16 Python
Python爬虫工具requests-html使用解析
Apr 29 Python
python语音识别指南终极版(有这一篇足矣)
Sep 09 Python
python数字图像处理之对比度与亮度调整示例
Jun 28 Python
Python os模块常用方法和属性总结
Feb 20 #Python
Python requests获取网页常用方法解析
Feb 20 #Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 #Python
Python argparse模块使用方法解析
Feb 20 #Python
浅谈pytorch torch.backends.cudnn设置作用
Feb 20 #Python
Python sqlite3查询操作过程解析
Feb 20 #Python
python利用datetime模块计算程序运行时间问题
Feb 20 #Python
You might like
初探PHP5
2006/10/09 PHP
BBS(php & mysql)完整版(一)
2006/10/09 PHP
js 动态修改css文件的方法
2014/08/05 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
2017/08/29 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
Vue中使用create-keyframe-animation与动画钩子完成复杂动画
2019/04/09 Javascript
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
python实现树形打印目录结构
2018/03/29 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
python 实现超级玛丽游戏
2020/11/25 Python
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
Oracle的内存结构(Memory structures)
2015/06/10 面试题
个人生活学习自我评价范文
2013/11/26 职场文书
计算机专业学生的自我评价
2013/12/15 职场文书
买房子个人收入证明
2014/01/16 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
给校长的建议书100字
2014/05/16 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
公积金具结保证书
2015/05/11 职场文书
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技