Source code for infrahouse_toolkit.timeout

"""
InfraHouse Toolkit timeout module.
"""

import signal
from contextlib import contextmanager


[docs]@contextmanager def timeout(seconds: int): """ Timeout context manager. :param seconds: Max execution time in seconds. :type seconds: int :raise TimeoutError: when the code under a ``with`` is running more than ``seconds``. """ def handler(signum, frame): if signum or frame: pass raise TimeoutError(f"Executing timed out after {seconds} seconds") original_handler = signal.signal(signal.SIGALRM, handler) try: signal.alarm(seconds) yield finally: signal.alarm(0) signal.signal(signal.SIGALRM, original_handler)