Python装饰器限制函数运行时间超时则退出执行


Posted in Python onApril 09, 2019

实际项目中会涉及到需要对有些函数的响应时间做一些限制,如果超时就退出函数的执行,停止等待。

可以利用python中的装饰器实现对函数执行时间的控制。

python装饰器简单来说可以在不改变某个函数内部实现和原来调用方式的前提下对该函数增加一些附件的功能,提供了对该函数功能的扩展。

方法一. 使用 signal

# coding=utf-8
import signal
import time
def set_timeout(num, callback):
  def wrap(func):
    def handle(signum, frame): # 收到信号 SIGALRM 后的回调函数,第一个参数是信号的数字,第二个参数是the interrupted stack frame.
      raise RuntimeError
    def to_do(*args, **kwargs):
      try:
        signal.signal(signal.SIGALRM, handle) # 设置信号和回调函数
        signal.alarm(num) # 设置 num 秒的闹钟
        print('start alarm signal.')
        r = func(*args, **kwargs)
        print('close alarm signal.')
        signal.alarm(0) # 关闭闹钟
        return r
      except RuntimeError as e:
        callback()
    return to_do
  return wrap
def after_timeout(): # 超时后的处理函数
  print("Time out!")
@set_timeout(2, after_timeout) # 限时 2 秒超时
def connect(): # 要执行的函数
  time.sleep(3) # 函数执行时间,写大于2的值,可测试超时
  print('Finished without timeout.')
if __name__ == '__main__':
  connect()

方法一中使用的signal有所限制,需要在linux系统上,并且需要在主线程中使用。方法二使用线程计时,不受此限制。

方法二. 使用Thread

# -*- coding: utf-8 -*-
from threading import Thread
import time
class TimeoutException(Exception):
  pass
ThreadStop = Thread._Thread__stop
def timelimited(timeout):
  def decorator(function):
    def decorator2(*args,**kwargs):
      class TimeLimited(Thread):
        def __init__(self,_error= None,):
          Thread.__init__(self)
          self._error = _error
        def run(self):
          try:
            self.result = function(*args,**kwargs)
          except Exception,e:
            self._error = str(e)
        def _stop(self):
          if self.isAlive():
            ThreadStop(self)
      t = TimeLimited()
      t.start()
      t.join(timeout)
      if isinstance(t._error,TimeoutException):
        t._stop()
        raise TimeoutException('timeout for %s' % (repr(function)))
      if t.isAlive():
        t._stop()
        raise TimeoutException('timeout for %s' % (repr(function)))
      if t._error is None:
        return t.result
    return decorator2
  return decorator
@timelimited(2) # 设置运行超时时间2S
def fn_1(secs):
  time.sleep(secs)
  return 'Finished without timeout'
def do_something_after_timeout():
  print('Time out!')
if __name__ == "__main__":
  try:
    print(fn_1(3)) # 设置函数执行3S
  except TimeoutException as e:
    print(str(e))
    do_something_after_timeout()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python中用Decorator来简化元编程的教程
Apr 13 Python
Python使用sftp实现上传和下载功能(实例代码)
Mar 14 Python
Python上下文管理器和with块详解
Sep 09 Python
python绘制铅球的运行轨迹代码分享
Nov 14 Python
Django后台获取前端post上传的文件方法
May 28 Python
python opencv旋转图像(保持图像不被裁减)
Jul 26 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
python ChainMap的使用和说明详解
Jun 11 Python
python取均匀不重复的随机数方式
Nov 27 Python
python实现高斯判别分析算法的例子
Dec 09 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
python时间time模块处理大全
Oct 25 Python
详解Python 解压缩文件
Apr 09 #Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 #Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 #Python
由Python编写的MySQL管理工具代码实例
Apr 09 #Python
python实现爬山算法的思路详解
Apr 09 #Python
Python使用Pickle模块进行数据保存和读取的讲解
Apr 09 #Python
Python爬取数据保存为Json格式的代码示例
Apr 09 #Python
You might like
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
js鼠标左右键 键盘值小结
2010/06/11 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
2013/04/15 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python的词法分析与语法分析
2013/05/18 Python
Python 详解基本语法_函数_返回值
2017/01/22 Python
Python json 错误xx is not JSON serializable解决办法
2017/03/15 Python
python+opencv实现动态物体追踪
2018/01/09 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
2018/07/09 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
安全责任书范文
2014/03/12 职场文书
学生安全责任书
2014/04/15 职场文书
党务公开方案
2014/05/06 职场文书
小区文明倡议书
2014/05/16 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
商铺门面租房协议书
2014/10/21 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang