Задать вопрос
@SAENAI

Синхронный код в асинхронном эндпоинте fastapi — блокирует ли он event loop?

В общем, если эндпоинт сам по себе синхронный в fastapi, то он не блокирует цикл событий - это я знаю (старлетт его автоматически кидает в ThreadPoolExecutor). Но что насчет синхронного кода (например, в зависимостях) в асинхронном эндпоинте - он блокирует или его нужно вручную закидывать в ThreadPoolExecutor?
async def get_me(
user_id: UserIdDependency (там синхронный код будет)
):
async def ....
  • Вопрос задан
  • 91 просмотр
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Синхронный код, вызванный напрямую внутри асинхронного эндпоинта (не через систему зависимостей) - будет блокировать event loop. Если у вас есть синхронная функция, которую нужно вызвать из асинхронного эндпоинта (и она не является зависимостью fastapi), вы должны явно отправить ее на выполнение в пул потоков, например:
from starlette.concurrency import run_in_threadpool
import asyncio

@app.get("/async-endpoint")
async def async_endpoint():
    # starlette style (python<3.9)
    # r = await run_in_threadpool(sync_func)
    
    # asyncio style (python>=3.9)
    r = await asyncio.to_thread(sync_func)

    return {"data": r}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы