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  连接字符串(join %)
Sep 06 Python
python http接口自动化脚本详解
Jan 02 Python
python中的文件打开与关闭操作命令介绍
Apr 26 Python
flask入门之文件上传与邮件发送示例
Jul 18 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
python实现一个简单的ping工具方法
Jan 31 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
python实现桌面托盘气泡提示
Jul 29 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 Python
Python实现8种常用抽样方法
Jun 27 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/02 无线电
php取得字符串首字母的方法
2015/03/25 PHP
JavaScript的Function详细
2006/11/14 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
浅析Javascript ES6新增值比较函数Object.is
2016/08/24 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
vue设置动态请求地址的例子
2019/11/01 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
python实现感知器算法详解
2017/12/19 Python
python/sympy求解矩阵方程的方法
2018/11/08 Python
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
学Python 3的理由和必要性
2019/11/19 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
超市采购员岗位职责
2014/02/01 职场文书
护理中职生求职信范文
2014/02/24 职场文书
法制宣传教育方案
2014/05/09 职场文书
任命书范本大全
2014/06/06 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
好人好事演讲稿
2014/09/01 职场文书
党的群众路线教育实践活动对照检查材料
2014/09/22 职场文书
草房子读书笔记
2015/06/29 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电