FastAPI führt API-Aufrufe seriell statt parallel aus
F: Warum werden FastAPI-API-Aufrufe seriell statt parallel ausgeführt?
A: Laut FastAPI-Dokumentation, wenn def anstelle von async def verwendet wird, um a zu definieren Bei der Pfadoperationsfunktion wird sie in einem externen Thread-Pool ausgeführt, auf den dann gewartet wird, statt direkt aufgerufen zu werden. Dies geschieht, um eine Blockierung des Servers zu verhindern.
Zusätzliche Überlegungen zur parallelen Ausführung:
asynchrone Def- vs. Def-Endpunkte:
-
async def: Funktionen werden direkt in der Ereignisschleife ausgeführt; werden gleichzeitig verarbeitet, solange sie auf nicht blockierende E/A-gebundene Vorgänge warten.
-
def: Funktionen werden in einem separaten Thread aus einem externen Thread-Pool ausgeführt; wird seriell verarbeitet, es sei denn, es wird außerhalb der Ereignisschleife ausgeführt.
Verwenden von Blockierungsvorgängen:
Wenn ein asynchroner Def-Endpunkt einen Blockierungsvorgang enthält und nicht wartet Nach Abschluss wird die Ereignisschleife blockiert und Anforderungen werden verarbeitet seriell.
Lösungen:
- Definieren Sie den Endpunkt mit normaler Definition anstelle von asynchroner Definition (wenn keine erwartbaren Vorgänge vorhanden sind).
- Verwenden Sie die Funktion run_in_threadpool() von FastAPI, um Blockierungsaufgaben separat auszuführen Thread.
- Verwenden Sie asyncios loop.run_in_executor() oder asyncio.to_thread(), um blockierende Aufgaben in einem separaten Executor oder Thread auszuführen.
Andere Optimierungsstrategien:
- Verwenden Sie mehr Worker, um die Vorteile von Multicore zu nutzen CPUs.
- Erwägen Sie die Verwendung von Celery oder AsyncIOScheduler für umfangreiche Hintergrundberechnungen.
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!