装饰器功能:函数超时则终止
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
)
|