在 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基于windows平台锁定键盘输入的方法
Mar 05 Python
Python解析nginx日志文件
May 11 Python
在Django的模板中使用认证数据的方法
Jul 23 Python
TensorFlow Session使用的两种方法小结
Jul 30 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
Mar 19 Python
Python通过文本和图片生成词云图
May 21 Python
使用pytorch 筛选出一定范围的值
Jun 28 Python
python操作redis数据库的三种方法
Sep 10 Python
Pycharm的Available Packages为空的解决方法
Sep 18 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 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
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
数据库中排序的对比及使用条件详解
2012/02/23 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
类似于QQ的右滑删除效果的实现方法
2016/10/16 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
Python中列表(list)操作方法汇总
2014/08/18 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
python基于ID3思想的决策树
2018/01/03 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
Python统计单词出现的次数
2018/04/04 Python
tensorflow 中对数组元素的操作方法
2018/07/27 Python
django连接mysql配置方法总结(推荐)
2018/08/18 Python
一百行python代码将图片转成字符画
2021/02/19 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
如何写出高性能的JSP和Servlet
2013/01/22 面试题
班组长安全职责
2014/01/05 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
quickjs 封装 JavaScript 沙箱详情
2021/11/02 Javascript
MySQL优化及索引解析
2022/03/17 MySQL