bazarr/libs/wraptor/decorators/timeout.py

32 lines
922 B
Python

from functools import wraps
import signal
class TimeoutException(Exception):
pass
class timeout(object):
""" Basic timeout decorator
* Uses signals, so this can only be used in the main thread of execution
* seconds must be a positive integer
Signal implementation based on http://code.activestate.com/recipes/307871-timing-out-function/
"""
def __init__(self, seconds=1):
self.seconds = seconds
def __call__(self, fn):
def sig_handler(signum, frame):
raise TimeoutException()
@wraps(fn)
def wrapped(*args, **kwargs):
old = signal.signal(signal.SIGALRM, sig_handler)
signal.alarm(self.seconds)
try:
result = fn(*args, **kwargs)
finally:
signal.signal(signal.SIGALRM, old)
signal.alarm(0)
return result
return wrapped