#python-asyncio #fastapi
Вопрос:
Нормально ли иметь 10-30-секундные сопрограммы в FastAPI?
(с точки зрения производительности FastApi и передовой практики)
Таким образом, у клиента будет открыт запрос-ответ в течение 10-30 секунд.
На стороне клиента мы используем React.js, так что для них это нормально.
@app.get("/somepath")
async def read_item():
async with aiohttp.ClientSession() as session:
# some slow external API, 10-30 seconds
async with session.get(f"https://external.website.com/{some_api_key}/") as response:
response_json = await response.json()
return response_json
Комментарии:
1. хорошо, в каких терминах ? производительность ? пользовательский опыт ?
2. с точки зрения производительности и передовой практики в FastAPI
Ответ №1:
это сработает. так что с этой стороны никаких проблем.
UX) это идеально подходит для больших работ. нет необходимости слишком сильно оптимизировать, если пользователь понимает, почему он ждет, и получает четкий ответ, когда данные готовы/не работают. при необходимости вы можете реализовать процент завершения с помощью socketio или sse (события, отправленные сервером).
Perf) вы можете значительно сократить время отклика (следовательно, производительность и ux) с помощью кэширования. (если вызов делает sens при кэшировании), это сократит время отклика и уменьшит количество одновременных запросов к серверу.
Комментарии:
1. Извините, но как мы можем быть уверены, что сохранение запроса-ответа открытым в течение 10-30 секунд нормально для FastApi с точки зрения его производительности? Итак, если у нас будет много таких сопрограмм, не повредит ли это производительности основного потока?
2. вам нужно сделать ориентир. это единственный способ оценить влияние для вашего варианта использования. но это явно работает.
Ответ №2:
Нормально ли иметь 10-30-секундные сопрограммы в FastAPI?
Во-первых, это не быстрый вопрос.
Сколько из этих запросов вы ожидаете получить параллельно? Много? Всего несколько? Вы хотите ограничить количество сопрограмм, которые вы запускаете одновременно? По умолчанию asyncio будет использовать как можно больше ресурсов. Это может быть то, чего ты хочешь, а может и нет. Если вы хотите ограничить количество сопрограмм, которые могут выполняться одновременно, и поставить запросы в очередь, вы можете посмотреть asyncio.Semaphore.
Что касается вашего вопроса, является ли это хорошей практикой или нет, это зависит от вашего рабочего процесса. Asyncio был создан специально для этой цели, для длительных фоновых задач, чтобы освободить приложение, пока они делают свое дело.
Теперь, если это лучшее решение для вашего случая, трудно сказать, не имея четкого представления о том, что делает ваше приложение. Что должно произойти, если пользователь закроет браузер, пока запрос все еще выполняется на сервере? Пользователь не получит отзыв о том, успешно ли он завершен. Вас волнует этот сценарий? Если вы это сделаете, вы могли бы подумать об использовании очереди и о том, чтобы у вас была работа, которая собирает вещи для обработки в фоновом режиме.