Fix worker startup via FastAPI lifespan, remove manual start from server script

This commit is contained in:
Кирилл Блинов 2026-05-29 12:30:39 +03:00
parent a10cc19e61
commit 5e62b3d308
3 changed files with 36 additions and 20 deletions

View File

@ -1,6 +1,7 @@
"""FastAPI backend для сервиса транскрибации.""" """FastAPI backend для сервиса транскрибации."""
import json import json
from contextlib import asynccontextmanager
from pathlib import Path from pathlib import Path
from typing import List, Optional from typing import List, Optional
@ -18,17 +19,8 @@ from backend.queue import (
get_processed_tree, get_processed_tree,
read_file_content, read_file_content,
set_progress_callback, set_progress_callback,
) start_workers,
stop_workers,
app = FastAPI(title="Transcription Service", version="1.0.0")
# CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
) )
# WebSocket менеджер # WebSocket менеджер
@ -57,6 +49,32 @@ manager = ConnectionManager()
set_progress_callback(manager.broadcast) set_progress_callback(manager.broadcast)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Управление жизненным циклом приложения."""
print("🚀 Запуск рабочих процессов...")
start_workers(num_workers=1)
yield
print("🛑 Остановка рабочих процессов...")
stop_workers()
app = FastAPI(
title="Transcription Service",
version="1.0.0",
lifespan=lifespan,
)
# CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# === API Endpoints === # === API Endpoints ===
@app.get("/", response_class=HTMLResponse) @app.get("/", response_class=HTMLResponse)

View File

@ -138,23 +138,26 @@ _workers: List[asyncio.Task] = []
async def _worker_loop(): async def _worker_loop():
"""Рабочий цикл обработки.""" """Рабочий цикл обработки."""
print("[Worker] Рабочий процесс запущен и ждёт задачи...")
while True: while True:
try: try:
task_id, file_path = await _queue.get() task_id, file_path = await _queue.get()
print(f"[Worker] Получена задача: {task_id}")
await process_file(file_path, task_id) await process_file(file_path, task_id)
_queue.task_done() _queue.task_done()
print(f"[Worker] Задача завершена: {task_id}")
except asyncio.CancelledError: except asyncio.CancelledError:
print("[Worker] Остановка рабочего процесса")
break break
except Exception as e: except Exception as e:
print(f"[Worker Error] {e}") print(f"[Worker Error] {e}")
def start_workers(num_workers: int = 1): def start_workers(num_workers: int = 1):
"""Запускает рабочих.""" """Запускает рабочих в текущем event loop."""
global _workers global _workers
loop = asyncio.get_event_loop()
for i in range(num_workers): for i in range(num_workers):
task = loop.create_task(_worker_loop()) task = asyncio.create_task(_worker_loop())
_workers.append(task) _workers.append(task)

View File

@ -7,18 +7,13 @@ from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent)) sys.path.insert(0, str(Path(__file__).parent))
import uvicorn import uvicorn
from backend.main import app
from backend.queue import start_workers
if __name__ == "__main__": if __name__ == "__main__":
print("🚀 Запуск сервиса транскрибации...") print("🚀 Запуск сервиса транскрибации...")
print("📡 Сервер: http://localhost:8000") print("📡 Сервер: http://localhost:8000")
print("") print("")
# Запускаем фоновых рабочих # Запускаем сервер (рабочие запускаются через lifespan в backend/main.py)
start_workers(num_workers=1)
# Запускаем сервер
uvicorn.run( uvicorn.run(
"backend.main:app", "backend.main:app",
host="0.0.0.0", host="0.0.0.0",