python使用装饰器和线程限制函数执行时间的方法


Posted in Python onApril 18, 2015

本文实例讲述了python使用装饰器和线程限制函数执行时间的方法。分享给大家供大家参考。具体分析如下:

很多时候函数内部包含了一些不可预知的事情,比如调用其它软件,从网络抓取信息,可能某个函数会卡在某个地方不动态,这段代码可以用来限制函数的执行时间,只需要在函数的上方添加一个装饰器,timelimited(2)就可以限定函数必须在2秒内执行完成,如果执行完成则返回函数正常的返回值,如果执行超时则会抛出错误信息。

# -*- 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 =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)
def fn_1(secs):
  time.sleep(secs)
  return 'Finished'
if __name__ == "__main__":
  print fn_1(4)

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python解析发往本机的数据包示例 (解析数据包)
Jan 16 Python
Python利用heapq实现一个优先级队列的方法
Feb 03 Python
Python中新式类与经典类的区别详析
Jul 10 Python
python异常触发及自定义异常类解析
Aug 06 Python
python通过移动端访问查看电脑界面
Jan 06 Python
Python 去除字符串中指定字符串
Mar 05 Python
基于FME使用Python过程图解
May 13 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
Python调用ffmpeg开源视频处理库,批量处理视频
Nov 16 Python
Python带你从浅入深探究Tuple(基础篇)
May 15 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 #Python
python对指定目录下文件进行批量重命名的方法
Apr 18 #Python
python开启多个子进程并行运行的方法
Apr 18 #Python
C#返回当前系统所有可用驱动器符号的方法
Apr 18 #Python
python关闭windows进程的方法
Apr 18 #Python
python使用Queue在多个子进程间交换数据的方法
Apr 18 #Python
python获取当前计算机cpu数量的方法
Apr 18 #Python
You might like
php注册审核重点解析(数据访问)
2017/05/23 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
jQuery 对象中的类数组操作
2009/04/27 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
Linux下编译安装php libevent扩展实例
2015/02/14 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
js简单设置与使用cookie的方法
2016/01/22 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Python3 Random模块代码详解
2017/12/04 Python
利用python如何处理nc数据详解
2018/05/23 Python
基于pip install django失败时的解决方法
2018/06/12 Python
python 以16进制打印输出的方法
2018/07/09 Python
一看就懂得Python的math模块
2018/10/21 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
解决Jupyter notebook更换主题工具栏被隐藏及添加目录生成插件问题
2020/04/20 Python
python urllib和urllib3知识点总结
2021/02/08 Python
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
2014年小学数学工作总结
2014/12/12 职场文书
现场施工员岗位职责
2015/04/11 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书