summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-02 15:42:12 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2026-04-02 15:42:12 +0900
commit0e177eafbed026445e50da6a5992177521fb8212 (patch)
tree84b648112917e05a80fe8e9743c6a66d2259764a /shared
parent913de6b1934881c0a8ee978cf6a0cfd664e1df9a (diff)
feat: add graceful shutdown with SIGTERM/SIGINT handlers to all services
Diffstat (limited to 'shared')
-rw-r--r--shared/src/shared/shutdown.py30
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)