@Dozent_AS

Как сделать Многопоточную или асинхронную обработку запросов FASTAPI?

Доброго дня! Я не силен в веб разработка да и вообще кодил давно!

Я написал сервер на ФАСТАПИ все методы асинхронные и он работает но!
В ходе выполнения работы моего сервера есть часть где идет ожидание ответа от другого сервиса!
И тут у меня возникают проблемы! А иммено:

Если сервер пример запрос от Юзер1 и если в момент подготовки ответа Юзер2 на сервер отправит еще запрос, то эта штука ждет пока будет обработан запрос от Юзер2, даже с учетом, что ответ для Юзер1 уже получин и становиться как бы в очередь!
А еще если пока готовиться ответ для Юзер2, Юзер1 пришлет еще запрос, то мы будем ждать пока придет ответ для второго запроса Юзер1 и потом когда на все запросы получен ответ, сервер выплевыет это всем сразу!

Как сделать так чтобы это работало в отдельном потоке? Как я вычитал если я назову метод асинхронным это не значит что он будет работать асинхронно или чото типо того.

Прошу помощи) Пока не нашел ответ на мою проблему!
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 2
@twistfire92
Python backend developer
Скорее всего у вас где-то вызывается синхронный код в асинхронном ендпоинте. И этот код блокирует 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), либо саму функцию ендпоинта сделайте синхронной.
Ответ написан
@Dozent_AS Автор вопроса
я решил)

Проблема была в том, что я присылал эти запросы из ТГ бота! В котором было синхронное обращение!
Перевод обращение к моей апишки на асинхрон и все заработало) всем спасибо)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы