diff --git a/lambda_local/timeout.py b/lambda_local/timeout.py index afd85c1..17646c3 100644 --- a/lambda_local/timeout.py +++ b/lambda_local/timeout.py @@ -4,7 +4,9 @@ ''' import signal +import threading from contextlib import contextmanager +from six.moves import _thread class TimeoutException(Exception): @@ -13,11 +15,21 @@ class TimeoutException(Exception): @contextmanager def time_limit(seconds): - def signal_handler(signum, frame): - raise TimeoutException("Timeout after {} seconds.".format(seconds)) - signal.signal(signal.SIGALRM, signal_handler) - signal.alarm(seconds) - try: - yield - finally: - signal.alarm(0) + if hasattr(signal, "SIGALRM"): + def signal_handler(signum, frame): + raise TimeoutException("Timeout after {} seconds.".format(seconds)) + signal.signal(signal.SIGALRM, signal_handler) + signal.alarm(seconds) + try: + yield + finally: + signal.alarm(0) + else: + timer = threading.Timer(seconds, lambda: _thread.interrupt_main()) + timer.start() + try: + yield + except KeyboardInterrupt: + raise TimeoutException("Timeout after {} seconds.".format(seconds)) + finally: + timer.cancel() diff --git a/setup.py b/setup.py index d6d48ad..595797c 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ def run_tests(self): sys.exit(pytest.main(self.test_args)) -version = "0.1.5" +version = "0.1.6" setup(name="python-lambda-local", version=version,