本文实例讲述了python使用装饰器和线程限制函数执行时间的方法。分享给大家供大家参考。具体分析如下:
很多时候函数内部包含了一些不可预知的事情,比如调用其它软件,从网络抓取信息,可能某个函数会卡在某个地方不动态,这段代码可以用来限制函数的执行时间,只需要在函数的上方添加一个装饰器,timelimited(2)就可以限定函数必须在2秒内执行完成,如果执行完成则返回函数正常的返回值,如果执行超时则会抛出错误信息。
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
|
# -*- 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程序设计有所帮助。