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学习笔记:字典的使用示例详解
Jun 13 Python
Python从MP3文件获取id3的方法
Jun 15 Python
Python的装饰器模式与面向切面编程详解
Jun 21 Python
Python找出list中最常出现元素的方法
Jun 14 Python
浅析Python中else语句块的使用技巧
Jun 16 Python
python音频处理用到的操作的示例代码
Oct 27 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
python多环境切换及pyenv使用过程详解
Sep 27 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
Python中免验证跳转到内容页的实例代码
Oct 23 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
php数组键值用法实例分析
2015/02/27 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
python实现百度关键词排名查询
2014/03/30 Python
Python最基本的输入输出详解
2015/04/25 Python
Django实现图片文字同时提交的方法
2015/05/26 Python
Scrapy的简单使用教程
2017/10/24 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
关于python导入模块import与常见的模块详解
2019/08/28 Python
Django之PopUp的具体实现方法
2019/08/31 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
电子商务网站的创业计划书
2014/01/05 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
优化Mysql查询的示例
2022/04/26 MySQL