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的urllib模块显示下载进度示例
Jan 17 Python
Python HTMLParser模块解析html获取url实例
Apr 08 Python
使用Python编写简单的画图板程序的示例教程
Dec 08 Python
Python 新建文件夹与复制文件夹内所有内容的方法
Oct 27 Python
解决Python pandas plot输出图形中显示中文乱码问题
Dec 12 Python
Python字符串内置函数功能与用法总结
Apr 16 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
OpenCV+Python--RGB转HSI的实现
Nov 27 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
Feb 12 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
pandas实现导出数据的四种方式
Dec 13 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 cookie使用方法学习笔记分享
2013/11/07 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
js实现文字滚动效果
2016/03/03 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
Python greenlet实现原理和使用示例
2014/09/24 Python
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Python实现的快速排序算法详解
2017/08/01 Python
python实现简易内存监控
2018/06/21 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
python简单验证码识别的实现方法
2019/05/10 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
技术总监管理职责范本
2014/03/06 职场文书
竞赛口号大全
2014/06/16 职场文书
会计学毕业生求职信
2014/06/25 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
普通党员整改措施
2014/10/24 职场文书
面试感谢信范文
2015/01/22 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python