146
by Diogo Matsubara
add timeout decorator |
1 |
# From
|
2 |
# http://stackoverflow.com/questions/2281850/timeout-function-if-it-takes-too-long-to-finish
|
|
3 |
from functools import wraps |
|
4 |
import errno |
|
5 |
import os |
|
6 |
import signal |
|
7 |
||
8 |
class TimeoutError(Exception): |
|
9 |
pass
|
|
10 |
||
11 |
def timeout(seconds=10, error_message=os.strerror(errno.ETIME)): |
|
12 |
def decorator(func): |
|
13 |
def _handle_timeout(signum, frame): |
|
14 |
raise TimeoutError(error_message) |
|
15 |
||
16 |
def wrapper(*args, **kwargs): |
|
17 |
signal.signal(signal.SIGALRM, _handle_timeout) |
|
18 |
signal.alarm(seconds) |
|
19 |
try: |
|
20 |
result = func(*args, **kwargs) |
|
21 |
finally: |
|
22 |
signal.alarm(0) |
|
23 |
return result |
|
24 |
||
25 |
return wraps(func)(wrapper) |
|
26 |
||
27 |
return decorator |