54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
|
|
"""Standalone cache warmer process for production aggregate payloads."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import signal
|
||
|
|
import threading
|
||
|
|
from types import FrameType
|
||
|
|
from typing import Optional
|
||
|
|
|
||
|
|
from loguru import logger
|
||
|
|
|
||
|
|
from web.cache_warmer_service import (
|
||
|
|
build_default_cache_warmer,
|
||
|
|
warmer_enabled,
|
||
|
|
warmer_tick_sec,
|
||
|
|
)
|
||
|
|
|
||
|
|
_STOP_EVENT = threading.Event()
|
||
|
|
|
||
|
|
|
||
|
|
def _handle_stop_signal(signum: int, _frame: Optional[FrameType]) -> None:
|
||
|
|
logger.info("cache warmer worker stopping signal={}", signum)
|
||
|
|
_STOP_EVENT.set()
|
||
|
|
|
||
|
|
|
||
|
|
def main() -> None:
|
||
|
|
signal.signal(signal.SIGINT, _handle_stop_signal)
|
||
|
|
signal.signal(signal.SIGTERM, _handle_stop_signal)
|
||
|
|
|
||
|
|
if not warmer_enabled():
|
||
|
|
logger.warning("cache warmer worker disabled; idling")
|
||
|
|
while not _STOP_EVENT.wait(3600):
|
||
|
|
pass
|
||
|
|
return
|
||
|
|
|
||
|
|
warmer = build_default_cache_warmer()
|
||
|
|
tick_sec = warmer_tick_sec()
|
||
|
|
logger.info(
|
||
|
|
"cache warmer worker started tick={}s city_batch={}",
|
||
|
|
tick_sec,
|
||
|
|
warmer.city_batch_size,
|
||
|
|
)
|
||
|
|
while not _STOP_EVENT.is_set():
|
||
|
|
try:
|
||
|
|
completed = warmer.run_due_once()
|
||
|
|
logger.debug("cache warmer run completed work_items={}", completed)
|
||
|
|
except Exception as exc:
|
||
|
|
logger.exception("cache warmer loop failed: {}", exc)
|
||
|
|
_STOP_EVENT.wait(tick_sec)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
main()
|