在 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基于递归算法实现的走迷宫问题
Aug 04 Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
Tensorflow 同时载入多个模型的实例讲解
Jul 27 Python
Python rstrip()方法实例详解
Nov 11 Python
pandas 时间格式转换的实现
Jul 06 Python
将python安装信息加入注册表的示例
Nov 20 Python
深入理解Python 多线程
Jun 16 Python
Python socket服务常用操作代码实例
Jun 22 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
Nov 19 Python
python中HTMLParser模块知识点总结
Jan 25 Python
Python集合set()使用的方法详解
Mar 18 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 面向对象 PHP5 中的常量
2010/05/05 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
浅谈node的事件机制
2017/10/09 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
详解python算法之冒泡排序
2019/03/05 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
Pandas分组与排序的实现
2019/07/23 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
大学生军训自我鉴定
2014/02/12 职场文书
计算机多媒体专业自荐信
2014/07/04 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫