„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann ich „ConnectionClosed“-Fehler vermeiden, wenn ich mit Uvicorn gleichzeitige HTTP-Anfragen in FastAPI mache?

Wie kann ich „ConnectionClosed“-Fehler vermeiden, wenn ich mit Uvicorn gleichzeitige HTTP-Anfragen in FastAPI mache?

Veröffentlicht am 21.12.2024
Durchsuche:617

How Can I Avoid

HTTP-Anfragen in Uvicorn/FastAPI stellen

Beim Umgang mit HTTP-Endpunkten, die mit FastAPI und Uvicorn erstellt wurden, ist es üblich, Daten von externen APIs anzufordern. Bei der Bearbeitung mehrerer gleichzeitiger Anfragen können jedoch Fehler wie „Ereignistyp ConnectionClosed kann nicht verarbeitet werden, wenn Rolle=SERVER und Status=SEND_RESPONSE“ auftreten. Dies liegt daran, dass die Standard-HTTP-Clientbibliothek „requests“ nicht vollständig threadsicher ist, wenn sie in einer solchen gleichzeitigen Umgebung verwendet wird.

Um dieses Problem zu beheben, sollten Sie die Implementierung der alternativen HTTP-Clientbibliothek namens httpx in Betracht ziehen. Es bietet eine asynchrone API, die hilft, Thread-Sicherheitsprobleme innerhalb von FastAPI zu vermeiden. Das folgende Beispiel zeigt, wie httpx in FastAPI verwendet wird:

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())) 

Durch die Verwendung der asynchronen API von httpx können Sie HTTP-Anfragen innerhalb von FastAPI effizienter verarbeiten und gleichzeitig die Thread-Sicherheit gewährleisten. Sie können die Größe des Verbindungspools mithilfe des Schlüsselwortarguments „limits“ im Client-Objekt weiter anpassen.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3