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

868次阅读  |  发布于5年以前

本文实例讲述了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程序设计有所帮助。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8