← Назад к вопросам
Делал ли синхронные таски в FastAPI
1.0 Junior🔥 121 комментариев
#FastAPI и Flask#Асинхронность и многопоточность
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Да, работал с синхронными задачами в FastAPI
В своей практике использовал несколько подходов для выполнения синхронных операций в асинхронном контексте FastAPI.
Встроенные таски FastAPI
Для простых фоновых задач используется встроенный механизм:
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.post("/send-notification/")
async def send_notification(email: str):
# Синхронная операция в фоновом режиме
background_tasks = BackgroundTasks()
background_tasks.add_task(send_email, email, message="Hello")
return JSONResponse({"message": "Email scheduled"})
def send_email(email: str, message: str):
# Синхронный код
import smtplib
# отправляем письмо
pass
Celery для сложных таск-систем
Для более серьёзных систем с очередями и retry-логикой используем Celery:
from celery import Celery
from fastapi import FastAPI
celery_app = Celery(
"tasks",
broker="redis://localhost:6379",
backend="redis://localhost:6379"
)
@celery_app.task
def process_payment(order_id: int):
# Синхронная операция
order = db.get_order(order_id)
result = payment_gateway.charge(order.amount)
return result
app = FastAPI()
@app.post("/orders/{order_id}/pay")
async def create_payment(order_id: int):
# Запускаем таск асинхронно
task = process_payment.delay(order_id)
return {"task_id": task.id}
@app.get("/tasks/{task_id}")
async def get_task_status(task_id: str):
task = celery_app.AsyncResult(task_id)
return {"status": task.status, "result": task.result}
Использование run_in_threadpool
Для синхронных операций внутри асинхронных функций используем run_in_threadpool:
from fastapi import FastAPI
from starlette.concurrency import run_in_threadpool
import time
app = FastAPI()
@app.get("/process")
async def process_data():
# Синхронная функция, которая может блокировать
result = await run_in_threadpool(expensive_sync_operation)
return result
def expensive_sync_operation():
# Синхронный код, вычисления, работа с БД
time.sleep(5)
return {"result": "processed"}
Практический опыт
В реальных проектах:
- Email рассылки — BackgroundTasks для простых случаев
- Платежи, интеграции — Celery с Redis
- Обработка файлов — run_in_threadpool для работы с disk I/O
- Синхронные библиотеки (requests вместо httpx) — также в threadpool
Критично помнить, что асинхронность в FastAPI требует правильного управления блокирующими операциями. Игнорирование этого приводит к зависаниям и деградации производительности серверного приложения.