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读写Excel文件的实例
Nov 01 Python
python logging类库使用例子
Nov 22 Python
整理Python最基本的操作字典的方法
Apr 24 Python
使用python实现BLAST
Feb 12 Python
django 多数据库配置教程
May 30 Python
对python3 一组数值的归一化处理方法详解
Jul 11 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
flask框架配置mysql数据库操作详解
Nov 29 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
Jan 18 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
python读取pdf格式文档的实现代码
Apr 01 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读取文件内容的几种方法详解
2013/06/26 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
事件模型在各浏览器中存在差异
2010/10/20 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
理解Python中的With语句
2016/03/18 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
django解决跨域请求的问题
2018/11/11 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
django rest framework 过滤时间操作
2020/07/12 Python
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
普通院校学生的自荐信
2013/11/27 职场文书
商铺租赁意向书
2014/04/01 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
自我检讨书怎么写
2015/05/07 职场文书
飞屋环游记观后感
2015/06/08 职场文书
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS