Выполнение HTTP-запросов в Uvicorn/FastAPI
При обработке конечных точек HTTP, созданных с использованием FastAPI и Uvicorn, обычно запрашиваются данные у внешних API. Однако при обработке нескольких одновременных запросов могут возникнуть такие ошибки, как «невозможно обработать тип события ConnectionClosed, когда роль = SERVER и состояние = SEND_RESPONSE». Это происходит потому, что клиентская библиотека HTTP по умолчанию, «запросы», не является полностью потокобезопасной при использовании в такой параллельной среде.
Чтобы решить эту проблему, рассмотрите возможность внедрения альтернативной клиентской библиотеки HTTP под названием httpx. Он предлагает асинхронный API, который помогает избежать проблем с безопасностью потоков в FastAPI. В примере ниже показано, как использовать httpx в FastAPI:
from fastapi import FastAPI, Request, BackgroundTask from fastapi.responses import StreamingResponse, Response from contextlib import asynccontextmanager import httpx @asynccontextmanager async def lifespan(app: FastAPI): async with httpx.AsyncClient() as client: yield {'client': client} app = FastAPI(lifespan=lifespan) @app.get('/') async def home(request: Request): client = request.state.client req = client.build_request('GET', 'https://www.example.com') r = await client.send(req, stream=True) return StreamingResponse(r.aiter_raw(), background=BackgroundTask(r.aclose()))
Используя асинхронный API httpx, вы можете более эффективно обрабатывать HTTP-запросы в FastAPI, сохраняя при этом потокобезопасность. Вы можете дополнительно настроить размер пула соединений, используя аргумент ключевого слова «limits» в объекте «Клиент».
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3