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 для сервиса транскрибации."""
import json
from contextlib import asynccontextmanager
from pathlib import Path
from typing import List, Optional
@ -18,17 +19,8 @@ from backend.queue import (
get_processed_tree,
read_file_content,
set_progress_callback,
)
app = FastAPI(title="Transcription Service", version="1.0.0")
# CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
start_workers,
stop_workers,
)
# WebSocket менеджер
@ -57,6 +49,32 @@ manager = ConnectionManager()
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 ===
@app.get("/", response_class=HTMLResponse)

View File

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

View File

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