Sobes.tech
Middle
27

Как вызов синхронной ручки повлияет на поведение всего FastAPI сервера?

Сұралған компаниялар
СБЕРСБЕР

AI-дан жауап

sobes.tech AI

FastAPI построен на асинхронном фреймворке, который позволяет обрабатывать множество запросов одновременно благодаря async/await.

Если в FastAPI вызвать синхронную (blocking) функцию в обработчике запроса, то этот вызов заблокирует текущий поток выполнения, что приведёт к снижению производительности и уменьшению количества одновременно обрабатываемых запросов.

Например, если сервер использует один рабочий процесс (worker), то во время выполнения синхронной функции другие запросы будут ждать, пока она завершится.

Чтобы избежать этого, рекомендуется:

  • Использовать асинхронные функции и библиотеки
  • Если необходимо вызвать синхронный код, выполнять его в отдельном потоке с помощью run_in_executor

Пример вызова синхронной функции в FastAPI с использованием run_in_executor:

import asyncio
from fastapi import FastAPI
import time

app = FastAPI()

def blocking_io():
    time.sleep(5)  # блокирующая операция
    return "done"

@app.get("/sync")
async def read_sync():
    loop = asyncio.get_running_loop()
    result = await loop.run_in_executor(None, blocking_io)
    return {"result": result}

Таким образом, вызов синхронной функции напрямую в обработчике FastAPI может негативно повлиять на производительность сервера.