"""task-watcher FastAPI entry — health + lifespan (watcher loop spawn).""" from __future__ import annotations import asyncio import logging from contextlib import asynccontextmanager from fastapi import FastAPI import watcher logging.basicConfig(level=logging.INFO, format="%(asctime)s %(name)s %(levelname)s %(message)s") logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): watcher_task = asyncio.create_task(watcher.watcher_loop()) logger.info("task-watcher lifespan 시작") try: yield finally: watcher_task.cancel() try: await watcher_task except asyncio.CancelledError: pass logger.info("task-watcher lifespan 종료") app = FastAPI(lifespan=lifespan) @app.get("/health") def health(): return {"ok": True, "service": "task-watcher"}