各位用户为了找寻关于python使用装饰器和线程限制函数执行时间的方法的资料费劲了很多周折。这里教程网为您整理了关于python使用装饰器和线程限制函数执行时间的方法的相关资料,仅供查阅,以下为您介绍关于python使用装饰器和线程限制函数执行时间的方法的详细内容
本文实例讲述了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程序设计有所帮助。