diff options
| author | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-04-02 15:42:12 +0900 |
|---|---|---|
| committer | TheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com> | 2026-04-02 15:42:12 +0900 |
| commit | 0e177eafbed026445e50da6a5992177521fb8212 (patch) | |
| tree | 84b648112917e05a80fe8e9743c6a66d2259764a /shared | |
| parent | 913de6b1934881c0a8ee978cf6a0cfd664e1df9a (diff) | |
feat: add graceful shutdown with SIGTERM/SIGINT handlers to all services
Diffstat (limited to 'shared')
| -rw-r--r-- | shared/src/shared/shutdown.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/shared/src/shared/shutdown.py b/shared/src/shared/shutdown.py new file mode 100644 index 0000000..4ed9aa7 --- /dev/null +++ b/shared/src/shared/shutdown.py @@ -0,0 +1,30 @@ +"""Graceful shutdown utilities for services.""" + +import asyncio +import logging +import signal + +logger = logging.getLogger(__name__) + + +class GracefulShutdown: + """Manages graceful shutdown via SIGTERM/SIGINT signals.""" + + def __init__(self) -> None: + self._event = asyncio.Event() + + @property + def is_shutting_down(self) -> bool: + return self._event.is_set() + + async def wait(self) -> None: + await self._event.wait() + + def trigger(self) -> None: + logger.info("shutdown_signal_received") + self._event.set() + + def install_handlers(self) -> None: + loop = asyncio.get_running_loop() + for sig in (signal.SIGTERM, signal.SIGINT): + loop.add_signal_handler(sig, self.trigger) |
