在 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 json模块使用实例
Apr 11 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
Python SQL查询并生成json文件操作示例
Aug 17 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
将python图片转为二进制文本的实例
Jan 24 Python
python实现超市商品销售管理系统
Oct 25 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python Print实现在输出中插入变量的例子
Dec 25 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
Python如何对齐字符串
Jul 30 Python
详解python 内存优化
Aug 17 Python
Python天气语音播报小助手
Sep 25 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常量详细解析
2015/10/27 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
var与Javascript变量隐式声明
2009/09/17 Javascript
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
用Python遍历C盘dll文件的方法
2015/05/06 Python
python中import reload __import__的区别详解
2017/10/16 Python
Django migrations 默认目录修改的方法教程
2018/09/28 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
中国最大的名表商城:万表网
2016/08/29 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
JS原生实现轮播图的几种方法
2021/03/23 Javascript
党员培训思想汇报
2014/01/07 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
财务会计实训报告
2014/11/05 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技