装饰器功能:函数超时则终止
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | # -*- 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 ) |