From 10b16082cdf784616036e3465623ee32455f88e7 Mon Sep 17 00:00:00 2001 From: YANG Xudong Date: Mon, 3 Sep 2018 12:32:40 +0900 Subject: [PATCH] Add timer timeout implementation for windows. --- lambda_local/timeout.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) 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()