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获取Linux系统的各种信息
Jul 10 Python
python根据出生日期获得年龄的方法
Mar 31 Python
python字典get()方法用法分析
Apr 17 Python
python使用PIL模块实现给图片打水印的方法
May 22 Python
matplotlib简介,安装和简单实例代码
Dec 26 Python
django ajax json的实例代码
May 29 Python
python 不以科学计数法输出的方法
Jul 16 Python
基于python实现名片管理系统
Nov 30 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
Django数据库操作之save与update的使用
Apr 01 Python
Python文件夹批处理操作代码实例
Jul 21 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
百事可乐也出咖啡了 双倍咖啡因双倍快乐
2021/03/03 咖啡文化
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
详解Node.js access_token的获取、存储及更新
2017/06/20 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
python实现的系统实用log类实例
2015/06/30 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
Python利用命名空间解析XML文档
2020/08/10 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
办公室主任先进事迹
2014/01/18 职场文书
幼儿园家长评语
2014/02/10 职场文书
干部选拔任用方案
2014/05/26 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
物流专业求职信
2014/06/30 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
python执行js代码的方法
2021/05/13 Python
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS