""" This module defines a context manager `catch_sigint()` which temporarily replaces the sigINT handler defined by the ASGI in order to allow the user to ^C the application and shut it down immediately. This was implemented in order to allow the user to interrupt slow model hashing during startup. Use like this: from invokeai.backend.util.catch_sigint import catch_sigint with catch_sigint(): run_some_hard_to_interrupt_process() """ import signal from contextlib import contextmanager from typing import Generator def sigint_handler(signum, frame): # type: ignore signal.signal(signal.SIGINT, signal.SIG_DFL) signal.raise_signal(signal.SIGINT) @contextmanager def catch_sigint() -> Generator[None, None, None]: original_handler = signal.getsignal(signal.SIGINT) signal.signal(signal.SIGINT, sigint_handler) yield signal.signal(signal.SIGINT, original_handler)