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中threading模块的几个常用方法
Jun 18 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 Python
python 拼接文件路径的方法
Oct 23 Python
python实现逐个读取txt字符并修改
Dec 24 Python
python 读取鼠标点击坐标的实例
Dec 29 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
python如何将图片转换素描画
Sep 08 Python
详解Django中异步任务之django-celery
Nov 05 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如何编写易读的代码
2007/07/10 PHP
php简单分页类实现方法
2015/02/26 PHP
PHP模拟QQ登录的方法
2015/07/29 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
JavaScript 数组详解
2013/10/10 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
在Python程序中实现分布式进程的教程
2015/04/28 Python
浅析Python中else语句块的使用技巧
2016/06/16 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
python中几种自动微分库解析
2019/08/29 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
python 如何在测试中使用 Mock
2021/03/01 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
中秋节礼品促销方案
2014/02/02 职场文书
创业者是否需要商业计划书?
2014/02/07 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
英文产品推荐信
2015/03/27 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python