Heim > Backend-Entwicklung > Python-Tutorial > Warum führt FastAPI API-Aufrufe seriell statt parallel aus?

Warum führt FastAPI API-Aufrufe seriell statt parallel aus?

Susan Sarandon
Freigeben: 2025-01-02 15:15:42
Original
217 Leute haben es durchsucht

Why Does FastAPI Execute API Calls Serially Instead of in Parallel?

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage