"""APScheduler 기반 백그라운드 잡. - 16:00 KST : daily_batch - (Phase 4) 16:30: 모델 추론, 02:00 일요일: 주간 재학습 FastAPI 기동 시점에 lifespan 으로 start, 종료 시 shutdown. """ from __future__ import annotations import logging from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.cron import CronTrigger from pytz import timezone from app.pipelines.daily_batch import run_daily_batch logger = logging.getLogger(__name__) KST = timezone("Asia/Seoul") _scheduler: BackgroundScheduler | None = None def start_scheduler() -> BackgroundScheduler: global _scheduler if _scheduler: return _scheduler _scheduler = BackgroundScheduler(timezone=KST) _scheduler.add_job( run_daily_batch, CronTrigger(hour=16, minute=0, timezone=KST), id="daily_batch_16", replace_existing=True, max_instances=1, ) _scheduler.start() logger.info("scheduler started (daily_batch @ 16:00 KST)") return _scheduler def shutdown_scheduler() -> None: global _scheduler if _scheduler: _scheduler.shutdown(wait=False) _scheduler = None logger.info("scheduler stopped")