在 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常见排序算法基础教程
Apr 13 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
Python3实现统计单词表中每个字母出现频率的方法示例
Jan 28 Python
Python地图绘制实操详解
Mar 04 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
pyqt5 获取显示器的分辨率的方法
Jun 18 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
Python类class参数self原理解析
Nov 19 Python
python实现文件分片上传的接口自动化
Nov 19 Python
python输出国际象棋棋盘的实例分享
Nov 26 Python
使用Pytorch实现two-head(多输出)模型的操作
May 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
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
php截取中文字符串函数实例
2015/02/23 PHP
php实现有序数组旋转后寻找最小值方法
2018/09/27 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
Python模块future用法原理详解
2020/01/20 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
美国中西部家用医疗设备商店:Med Mart(轮椅、踏板车、升降机等)
2019/04/26 全球购物
this关键字的含义
2015/04/08 面试题
应届本科生推荐信范文
2013/12/25 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
婚庆主持词大全
2015/06/30 职场文书
教你用python控制安卓手机
2021/05/13 Python
Go 中的空白标识符下划线
2022/03/25 Golang
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS