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根据经纬度计算距离示例
Feb 16 Python
Python单元测试框架unittest简明使用实例
Apr 13 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
基于hashlib模块--加密(详解)
Jun 21 Python
tensorflow训练中出现nan问题的解决
Feb 10 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 Python
python中的 zip函数详解及用法举例
Feb 16 Python
Python bytes string相互转换过程解析
Mar 05 Python
Python日志logging模块功能与用法详解
Apr 09 Python
用python实现一个简单的验证码
Dec 09 Python
Python之多进程与多线程的使用
Feb 23 Python
Pygame Time时间控制的具体使用详解
Nov 17 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中常用的预定义变量小结
2012/05/09 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
多个iframe自动调整大小的问题
2006/09/18 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
JS实现图片居中悬浮效果
2017/12/25 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
vue-router传参用法详解
2019/01/19 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
Python根据服务获取端口号的方法
2019/09/25 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
python中Django文件上传方法详解
2020/08/05 Python
彪马美国官网:PUMA美国
2017/03/09 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
文史专业毕业生自荐信
2013/11/17 职场文书
班组长工作职责
2013/12/25 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
论群众路线学习笔记
2014/11/06 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书