«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как избежать ошибок ConnectionClosed при выполнении одновременных HTTP-запросов в FastAPI с использованием Uvicorn?

Как избежать ошибок ConnectionClosed при выполнении одновременных HTTP-запросов в FastAPI с использованием Uvicorn?

Опубликовано 21 декабря 2024 г.
Просматривать:855

How Can I Avoid

Выполнение 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