FastAPI: Warum API-Aufrufe seriell statt parallel ausgeführt werden
FastAPI definiert Endpunkte (auch als Pfadoperationsfunktionen bekannt) mithilfe beider asynchroner Methoden def und def. Während async def konzeptionell eine Parallelisierung suggerieren könnte, behandelt FastAPI diese Funktionen tatsächlich anders:
Endpoints Defined with async def:
- Direkt in der Ereignisschleife ausführen.
- Kann nur von anderen asynchronen Funktionen aufgerufen werden und muss pausieren (warten), bevor nicht asynchrone Vorgänge ausgeführt werden. wie E/A.
- Stellen Sie sicher, dass die Ereignisschleife nicht blockiert ist und dass andere Aufgaben gleichzeitig ausgeführt werden können.
Endpunkte definiert mit def:
- Führen Sie nicht direkt in der Ereignisschleife aus, sondern in einem separaten Thread von einem externen Threadpool.
- Kann entweder von asynchronen oder nicht-asynchronen Funktionen aufgerufen werden.
- Kann die Ereignisschleife blockieren und die Ausführung anderer Aufgaben verhindern, wenn nicht-asynchrone Vorgänge ohne Pause ausgeführt werden.
- Bieten Sie Leistungsoptimierungen in bestimmten Szenarien an.
Auswirkungen auf Parallelisierung:
Basierend auf diesem Verständnis untersuchen wir Ihr Codebeispiel:
@app.get("/ping")
async def ping(request: Request):
print("Hello")
time.sleep(5) # This sleeps the event loop for 5 seconds
print("bye")
return {"ping": "pong!"}
Nach dem Login kopieren
In diesem Fall geschieht Folgendes:
- Zwei Anfragen an /ping werden gleichzeitig gesendet.
- Der asynchrone defENDPOINT läuft direkt im Event Schleife.
- Der Aufruf von time.sleep(5) unterbricht die Ereignisschleife für 5 Sekunden.
- Während dieser 5 Sekunden steht die zweite Anfrage in der Warteschlange und kann nicht verarbeitet werden, da die Ereignisschleife blockiert ist .
- Sobald die Ereignisschleife nach 5 Sekunden fortgesetzt wird, wird die zweite Anfrage verarbeitet.
Als Als Ergebnis werden die Antworten seriell gedruckt:
Hello
bye
Hello
bye
Nach dem Login kopieren
Um die Parallelisierung zu ermöglichen, sollten nicht-asynchrone Vorgänge wie time.sleep() nicht in asynchronen Def-Endpunkten verwendet werden. Stattdessen kann einer der folgenden Ansätze angewendet werden:
- Verwenden Sie run_in_threadpool(), um einen Thread zu erzeugen und den Blockierungsvorgang außerhalb der Ereignisschleife auszuführen.
- Verwenden Sie loop.run_in_executor() oder asyncio.to_thread(), um den Blockierungsvorgang in einem separaten Thread oder Prozess auszuführen.
- Erwägen Sie die Verwendung ThreadPoolExecutor oder ProcessPoolExecutor, um rechenintensive Aufgaben außerhalb des Prozesses auszuführen.
Das obige ist der detaillierte Inhalt vonWarum führt FastAPI API-Aufrufe seriell statt parallel aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!