Скорее всего у вас где-то вызывается синхронный код в асинхронном ендпоинте. И этот код блокирует event loop.
Посмотрите пример
@app.get("/delay")
async def delay():
time.sleep(10)
return {"result": "OK!"}
@app.get("/instantly")
async def instantly():
return {"result": "OK!"}
Если сделать запрос на
/delay и тут же сделать запрос на
/instantly, получится то, о чем я говорю, когда синхронная
time.sleep()
блокирует цикл событий. Ответ от второго запроса придет только после отработки первого. Обратите внимание, что
delay объявлена через
async def.
Исправить это можно двумя способами
- Использовать асинхронный
await asyncio.sleep()
@app.get("/delay")
async def delay():
await asyncio.sleep(10)
return {"result": "OK!"}
- Объявить функцию синхронной через
def
@app.get("/delay")
def delay():
time.sleep(10)
return {"result": "OK!"}
Возможно именно в этом у вас проблема. Найдите синхронный код и либо перепишите на асинхронный вариант, если это возможно (если для обращения в другой сервис вы используете
requests, замените на
aiohttp или
httpx), либо саму функцию ендпоинта сделайте синхронной.