-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstartup.py
More file actions
66 lines (53 loc) · 1.65 KB
/
Copy pathstartup.py
File metadata and controls
66 lines (53 loc) · 1.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""Startup utilities: signal handling and interruptible sleep (K8s-safe)."""
import signal
import time
from functools import partial
from threading import Event
from types import FrameType
from loguru import logger
from rich.console import Console
def handle_shutdown(
signum: int,
frame: FrameType | None,
shutdown_event: Event,
console: Console,
) -> None:
"""Handle SIGTERM / SIGINT (idempotent)."""
if shutdown_event.is_set():
return
shutdown_event.set()
console.print("\n[yellow]Shutdown signal received... stopping gracefully[/yellow]")
logger.warning(
{
"event": "shutdown",
"signal": signum,
}
)
logger.debug(f"Signal frame: {frame}")
def _handler(
signum: int,
frame: FrameType | None,
shutdown_event: Event,
console: Console,
) -> None:
"""Thin wrapper to adapt signal handler signature."""
handle_shutdown(signum, frame, shutdown_event, console)
def register_signals(shutdown_event: Event, console: Console) -> None:
"""Register signal handlers for graceful shutdown."""
handler = partial(
_handler,
shutdown_event=shutdown_event,
console=console,
)
signal.signal(signal.SIGTERM, handler)
signal.signal(signal.SIGINT, handler)
def sleep_interruptible(seconds: float, shutdown_event: Event) -> None:
"""Sleep in small increments, exiting early if shutdown is triggered.
K8s-safe: ensures fast shutdown (<100ms granularity)
"""
step = 0.05
end = time.monotonic() + seconds
while time.monotonic() < end:
if shutdown_event.is_set():
return
time.sleep(step)