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写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
使用Python生成url短链接的方法
May 04 Python
深入讲解Python中面向对象编程的相关知识
May 25 Python
python中plot实现即时数据动态显示方法
Jun 22 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
Oct 14 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
Python with语句和过程抽取思想
Dec 23 Python
Python 批量读取文件中指定字符的实现
Mar 06 Python
Python绘图之二维图与三维图详解
Aug 04 Python
Python实现邮件发送的详细设置方法(遇到问题)
Jan 18 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 flush类输出缓冲剖析
2008/10/19 PHP
PHP连接SQLServer2005 的问题解决方法
2010/07/19 PHP
php时区转换转换函数
2014/01/07 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
2016/08/23 PHP
PHP反射API示例分享
2016/10/08 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
Jquery获取radio选中值实例总结
2019/01/17 jQuery
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
Python与shell的3种交互方式介绍
2015/04/11 Python
Python中的Matplotlib模块入门教程
2015/04/15 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
python分割列表(list)的方法示例
2017/05/07 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
促销活动策划方案
2014/01/12 职场文书
迟到检讨书800字
2014/01/13 职场文书
元旦晚会感言
2014/03/12 职场文书
2014年社区工作总结
2014/11/18 职场文书
任命通知范文
2015/04/21 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技