29 lines
623 B
Python
29 lines
623 B
Python
import errno
|
|
import os
|
|
import signal
|
|
|
|
from functools import wraps
|
|
|
|
|
|
class TimeoutError(Exception):
|
|
pass
|
|
|
|
|
|
def timeout(seconds, error_message = os.strerror(errno.ETIME)):
|
|
def decorator(func):
|
|
def _handle_timeout(signum, frame):
|
|
raise TimeoutError(error_message)
|
|
|
|
def wrapper(*args, **kwargs):
|
|
signal.signal(signal.SIGALRM, _handle_timeout)
|
|
signal.alarm(seconds)
|
|
try:
|
|
result = func(*args, **kwargs)
|
|
finally:
|
|
signal.alarm(0)
|
|
return result
|
|
|
|
return wraps(func)(wrapper)
|
|
|
|
return decorator
|