mirror of https://github.com/morpheus65535/bazarr
32 lines
922 B
Python
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
|