Sobes.tech
Back to questions
Middle
3

Что делать, если в асинхронном приложении (FastAPI) есть блокирующая синхронная I/O-операция?

Companies where asked
ИП Ганус Александр Андреевич

Answer from AI

sobes.tech AI

В FastAPI, который основан на asyncio, блокирующие синхронные I/O операции могут заблокировать весь event loop, что приведёт к снижению производительности и задержкам.

Чтобы решить эту проблему, можно:

  • Вынести блокирующую операцию в отдельный поток или процесс с помощью run_in_executor:
import asyncio
from fastapi import FastAPI

app = FastAPI()

def blocking_io():
    # Например, чтение из файла или запрос к базе данных без async
    import time
    time.sleep(5)
    return "done"

@app.get("/blocking")
async def read_blocking():
    loop = asyncio.get_running_loop()
    result = await loop.run_in_executor(None, blocking_io)
    return {"result": result}
  • Использовать асинхронные библиотеки для I/O, если они доступны (например, httpx вместо requests, databases вместо синхронных драйверов БД).

  • Если операция очень тяжёлая, рассмотреть выделение её в отдельный микросервис или задачу в очереди.

Таким образом, блокирующая операция не будет мешать обработке других запросов.