签到成功

知道了

CNDBA社区CNDBA社区

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

2018-10-19 10:49 2816 0 原创 Python
作者: dave

在前面之前的博客,我们看了Python 装饰器的说明:
Python 装饰器 说明
https://www.cndba.cn/dave/article/3090http://www.cndba.cn/cndba/dave/article/3091

http://www.cndba.cn/cndba/dave/article/3091
http://www.cndba.cn/cndba/dave/article/3091

Python 多线程与多进程 概念和操作示例
https://www.cndba.cn/dave/article/2155http://www.cndba.cn/cndba/dave/article/3091http://www.cndba.cn/cndba/dave/article/3091

http://www.cndba.cn/cndba/dave/article/3091
http://www.cndba.cn/cndba/dave/article/3091

我们可以通过Python 装饰器和线程来限制函数的执行时间。如果执行完成则返回函数正常的返回值,如果执行超时则会抛出错误信息。 http://www.cndba.cn/cndba/dave/article/3091

http://www.cndba.cn/cndba/dave/article/3091
http://www.cndba.cn/cndba/dave/article/3091

# -*- 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 dave(secs):
    time.sleep(secs)
    print "My Blog is: http://www.cndba.cn/dave"
    return 'Finished'

if __name__ == "__main__":
    print dave(4)

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2262
    原创
  • 3
    翻译
  • 578
    转载
  • 192
    评论
  • 访问:8070349次
  • 积分:4349
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ