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.
Das obige ist der detaillierte Inhalt vonWie kann ich „ConnectionClosed'-Fehler vermeiden, wenn ich gleichzeitige HTTP-Anfragen in FastAPI mit Uvicorn mache?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!