在 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 (1)
Oct 31 Python
使用python在校内发人人网状态(人人网看状态)
Feb 19 Python
Python单元测试框架unittest使用方法讲解
Apr 13 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
用Python实现命令行闹钟脚本实例
Sep 05 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
Mar 08 Python
Python批量处理csv并保存过程解析
May 16 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
如何教少儿学习Python编程
Jul 10 Python
超级实用的8个Python列表技巧
Aug 24 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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
php array_search() 函数使用
2010/04/13 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
2019/06/08 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
JS实现物体带缓冲的间歇运动效果示例
2016/12/22 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
Python抓取京东图书评论数据
2014/08/31 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
房地产促销活动方案
2014/03/01 职场文书
中学校庆方案
2014/03/17 职场文书
社区党建工作汇报材料
2014/10/27 职场文书
西安导游词
2015/02/12 职场文书
婚姻出轨保证书
2015/05/08 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle