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中使用dom模块生成XML文件示例
Apr 05 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
详解Python中列表和元祖的使用方法
Apr 25 Python
Python 多线程抓取图片效率对比
Feb 27 Python
简述Python2与Python3的不同点
Jan 21 Python
使用Python开发SQLite代理服务器的方法
Dec 07 Python
python利用Opencv实现人脸识别功能
Apr 25 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
Python+Appium实现自动化测试的使用步骤
Mar 24 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
详解Selenium 元素定位和WebDriver常用方法
Dec 04 Python
详解Open Folder as PyCharm Project怎么添加的方法
Dec 29 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概述.
2006/10/09 PHP
thinkPHP5.0框架安装教程
2017/03/25 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
javascript入门·对象属性方法大总结
2007/10/01 Javascript
JS 模态对话框和非模态对话框操作技巧汇总
2013/04/15 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
python使用生成器实现可迭代对象
2018/03/20 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
Python 实现某个功能每隔一段时间被执行一次的功能方法
2018/10/14 Python
Python3爬虫之自动查询天气并实现语音播报
2019/02/21 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
Python实现把类当做字典来访问
2019/12/16 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
如何利用python进行时间序列分析
2020/08/04 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
运动会领导邀请函
2014/01/10 职场文书
社会实践感言
2014/01/25 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
竞选班委演讲稿
2014/04/28 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书