GitHub Actions
Deploy from GitHub Actions
3885f96
Raw
History Blame Contribute Delete
2.12 kB
import asyncio
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from app.routers import generator_page
from app.ml_model.processing import generate_ad_from_image
from app.state import TASK_QUEUE, TASK_RESULTS
async def worker():
"""
Фоновый "работник", который в бесконечном цикле берет задачи из очереди,
выполняет их и сохраняет результат.
"""
print("Воркер запущен и готов к работе...")
while True:
# Ждем, пока в очереди появится новая задача
task = await TASK_QUEUE.get()
task_id = task["task_id"]
image_bytes = task["image_bytes"]
style = task["style"]
print(f"Воркер взял в работу задачу: {task_id}")
try:
result = await asyncio.to_thread(generate_ad_from_image, image_bytes, style)
TASK_RESULTS[task_id] = {"status": "completed", "data": result}
print(f"Задача {task_id} успешно выполнена.")
except Exception as e:
print(f"Ошибка при выполнении задачи {task_id}: {e}")
TASK_RESULTS[task_id] = {"status": "failed", "error": str(e)}
finally:
# Сообщаем очереди, что задача обработана
TASK_QUEUE.task_done()
@asynccontextmanager
async def lifespan(app: FastAPI):
"""
Управляет жизненным циклом приложения. Запускает фонового воркера при старте.
"""
# Запускаем нашего воркера как фоновую задачу
asyncio.create_task(worker())
yield
app = FastAPI(title="Генератор объявлений", lifespan=lifespan)
# Подключаем роутер и статику
app.include_router(generator_page.router)
app.mount("/static", StaticFiles(directory="app/static"), name="static")