Problemstellung:
Obwohl FastAPI parallele Funktionen bietet, API Gleichzeitig über mehrere Browser-Registerkarten getätigte Anrufe werden nacheinander und nicht parallel verarbeitet. Dieses Verhalten tritt auf, wenn Endpunkte mit def statt mit async def definiert werden.
Analyse und Lösung:
FastAPI verwendet einen externen Threadpool, um mit def definierte Endpunkte zu verarbeiten. Wenn ein solcher Endpunkt eine Anfrage empfängt, führt FastAPI diese in einem vom Threadpool separaten Thread aus. Allerdings kann jeweils nur eine Anfrage verarbeitet werden, was zu einer sequentiellen Anfrageverarbeitung und nicht zu echter Parallelität führt.
Im Gegensatz dazu werden mit async def definierte Endpunkte direkt in der Hauptereignisschleife ausgeführt, was eine echte parallele Anfrageverarbeitung ermöglicht . Dies liegt daran, dass Warteaufrufe innerhalb asynchroner Def-Endpunkte anderen Aufgaben in der Ereignisschleife weichen, während sie auf asynchrone Vorgänge warten.
Um das Problem zu beheben, stellen Sie sicher, dass Endpunkte definiert sind, die keine blockierenden E/A-gebundenen Vorgänge erfordern mit async def, um die parallelen Funktionen von FastAPI zu nutzen. Hier ist ein Beispiel für einen Endpunkt, der parallel ausgeführt werden kann:
@app.get("/ping") async def ping(request: Request): print("Hello") await asyncio.sleep(5) print("bye") return {"ping": "pong!"}
Zusätzliche Erkenntnisse:
Das obige ist der detaillierte Inhalt vonWarum verarbeitet meine FastAPI-Anwendung gleichzeitige Anforderungen sequentiell statt parallel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!