Fix worker startup via FastAPI lifespan, remove manual start from server script
This commit is contained in:
parent
a10cc19e61
commit
5e62b3d308
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
|
||||
@ -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",
|
||||
|
||||
Loading…
Reference in New Issue
Block a user