在 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函数中的默认参数
Mar 30 Python
在Python的Flask框架中使用模版的入门教程
Apr 20 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 Python
Python实现的字典值比较功能示例
Jan 08 Python
python机器学习理论与实战(一)K近邻法
Jan 28 Python
Python爬取qq空间说说的实例代码
Aug 17 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
python入门之基础语法学习笔记
Feb 08 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
浅谈python 类方法/静态方法
Sep 18 Python
Python 使用dict实现switch的操作
Apr 07 Python
教你使用TensorFlow2识别验证码
Jun 11 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
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
javascript实现全角与半角字符的转换
2015/01/07 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
微信小程序实现打开内置地图功能【附源码下载】
2017/12/07 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
js实现消灭星星(web简易版)
2020/03/24 Javascript
Python交换变量
2008/09/06 Python
Python+Opencv识别两张相似图片
2020/03/23 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
2019/06/17 Python
pandas中read_csv的缺失值处理方式
2019/12/19 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
python属于软件吗
2020/06/18 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
蜜蜂引路教学反思
2014/02/04 职场文书
班班通校本培训方案
2014/03/12 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
爱的承诺书
2015/01/20 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
详解Node.js如何处理ES6模块
2021/05/15 Javascript
Oracle锁表解决方法的详细记录
2022/06/05 Oracle
Vite + React从零开始搭建一个开源组件库
2022/06/25 Javascript