"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como posso evitar erros de “ConnectionClosed” ao fazer solicitações HTTP simultâneas no FastAPI usando Uvicorn?

Como posso evitar erros de “ConnectionClosed” ao fazer solicitações HTTP simultâneas no FastAPI usando Uvicorn?

Publicado em 2024-12-21
Navegar:146

How Can I Avoid

Fazendo solicitações HTTP em Uvicorn/FastAPI

Ao lidar com endpoints HTTP criados usando FastAPI e Uvicorn, é comum solicitar dados de APIs externas. No entanto, ao lidar com diversas solicitações simultâneas, podem surgir erros como "não é possível manipular o tipo de evento ConnectionClosed quando role=SERVER e state=SEND_RESPONSE". Isso acontece porque a biblioteca cliente HTTP padrão, 'solicitações', não é totalmente segura para threads quando utilizada em um ambiente simultâneo.

Para resolver esse problema, considere implementar a biblioteca cliente HTTP alternativa chamada httpx. Ele oferece uma API assíncrona que ajuda a evitar problemas de segurança de thread no FastAPI. O exemplo abaixo mostra como empregar httpx no 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())) 

Ao utilizar a API assíncrona do httpx, você pode lidar com solicitações HTTP dentro do FastAPI com mais eficiência, mantendo a segurança do thread. Você pode personalizar ainda mais o tamanho do pool de conexões usando o argumento de palavra-chave 'limits' no objeto Cliente.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3