Python装饰器应用案例

装饰器功能:函数超时则终止

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 )  
   
             =  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 )


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值