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爬虫框架Scrapy实战之批量抓取招聘信息
Aug 07 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
Python图片裁剪实例代码(如头像裁剪)
Jun 21 Python
python安装numpy&安装matplotlib& scipy的教程
Nov 02 Python
python3学习笔记之多进程分布式小例子
Feb 13 Python
python对视频画框标记后保存的方法
Dec 07 Python
Python中new方法的详解
Jan 15 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
用Python制作音乐海报
Jan 26 Python
Python接口自动化之文件上传/下载接口详解
Apr 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
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
php Try Catch异常测试
2009/03/01 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
Javascript Math对象
2009/08/13 Javascript
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
jQuery实现图片轮播效果代码
2016/09/27 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
vue内置指令详解
2018/04/03 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
Python下载懒人图库JavaScript特效
2015/05/28 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
python tkinter基本属性详解
2019/09/16 Python
django中瀑布流写法实例代码
2019/10/14 Python
创建Shapefile文件并写入数据的例子
2019/11/26 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
驾驶员岗位职责
2014/01/29 职场文书
给老婆的婚前保证书
2014/02/01 职场文书
结婚喜宴主持词
2014/03/14 职场文书
党员一句话承诺大全
2014/03/28 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android
Redis基本数据类型String常用操作命令
2022/06/01 Redis