Erkundung von ASGI: Pythons asynchrones Protokoll für Web-Apps
Wenhao Wang
Dev Intern · Leapcell

ASGI und Uvicorn im FastAPI-Entwicklungsprozess verstehen
Bei der Entwicklung mit FastAPI müssen wir den Uvicorn-Server verwenden. Anfänger fragen sich vielleicht warum. Heute werden wir diese Frage beantworten.
Uvicorn
Lassen Sie uns eine einfache HTTP-Anfrage mit HTTP implementieren:
import json # Definiere eine Hilfsfunktion, um Bytes in Headern in Strings umzuwandeln def convert_bytes_to_str(data): if isinstance(data, bytes): return data.decode('utf-8') if isinstance(data, tuple): return tuple(convert_bytes_to_str(item) for item in data) if isinstance(data, list): return [convert_bytes_to_str(item) for item in data] if isinstance(data, dict): return {key: convert_bytes_to_str(value) for key, value in data.items()} return data async def app(scope, receive, send): # print(scope) data = convert_bytes_to_str(scope) print(json.dumps(data, indent=4)) # Überprüfe den Typ der Anfrage if scope['type'] == 'http': # Warte auf den HTTP-Anfragekörper event = await receive() # Antwortinhalt response_body = json.dumps({"message": "Hallo, ASGI!"}).encode('utf-8') # Sende die HTTP-Antwortheader await send({ 'type': 'http.response.start', 'status': 200, 'headers': [ (b'content-type', b'application/json'), ], }) # Sende den HTTP-Antwortkörper await send({ 'type': 'http.response.body', 'body': response_body, })
Das scope-Feld enthält binäre Strings, daher benötigen wir eine Konvertierungsfunktion convert_bytes_to_str. Lassen Sie uns diese kurz analysieren. Informationen zum Anfragepfad und zur Methode befinden sich in scope. Da scope mehr als nur HTTP unterstützt, müssen wir type verwenden, um den Typ des aktuellen Protokolls zu bestimmen. Dann verwenden wir die Funktion receive, um den Anfragekörper zu empfangen. Als Nächstes erstellen wir einen Antwortkörper mit json.dumps und codieren ihn mit encode. Schließlich senden wir die Anfrageheader und den Anfragekörper.
Hier senden wir die Daten zweimal. Dieses Design erfüllt die Anforderungen der asynchronen Programmierung und verbessert die Verarbeitungsfähigkeit für verschiedene Anwendungsszenarien (Streaming-Antwort). Mit einem Verständnis für reale Projekte können wir ASGI nun von einer theoretischen Basis aus verstehen.
ASGI
Das Asynchronous Server Gateway Interface (ASGI) ist ein Python-Protokoll zum Erstellen asynchroner Webanwendungen.
Hauptmerkmale von ASGI
- Asynchrone Unterstützung: Ermöglicht asynchrone Programmierung.
- Multi-Protokoll-Unterstützung: Unterstützt Protokolle wie WebSocket und Long-Polling, was bedeutet, dass es http/https/websocket unterstützt.
- Concurrency-Unterstützung: Kann mehrere Anfragen gleichzeitig verarbeiten.
- Kommunikation: Anwendungen und Server sowie verschiedene Teile einer Anwendung interagieren durch das Senden und Empfangen von Nachrichten.
Zusammensetzung des ASGI-Protokolls
- Anwendungsschnittstelle
- Die ASGI-Anwendungsschnittstelle definiert, wie eine Anwendung mit einem ASGI-Server interagiert. Eine ASGI-Anwendung ist ein aufrufbares Objekt, normalerweise eine asynchrone Funktion, die zwei Parameter akzeptiert:
scopeundreceiveund einen asynchronen Generatorsendzurückgibt.- scope: Ein Dictionary, das Informationen über die Anfrage enthält, wie z. B. den Anfrage-Typ (HTTP oder WebSocket), Pfad, Query-String, Serverinformationen usw.
- receive: Ein asynchroner Aufruf, der verwendet wird, um Ereignisse vom ASGI-Server zu empfangen.
- send: Ein asynchroner Generator, der verwendet wird, um Ereignisse zurück an den ASGI-Server zu senden.
- Die ASGI-Anwendungsschnittstelle definiert, wie eine Anwendung mit einem ASGI-Server interagiert. Eine ASGI-Anwendung ist ein aufrufbares Objekt, normalerweise eine asynchrone Funktion, die zwei Parameter akzeptiert:
- Serverschnittstelle
- Zu den Hauptaufgaben der Serverschnittstelle gehören:
- Akzeptieren von Verbindungen von Clients.
- Erstellen eines
scopefür jede Verbindung. - Aufrufen der
receive- undsend-Methoden der Anwendung, um Ereignisse zu übergeben. - Behandeln von Netzwerkfehlern und Schließen von Verbindungen.
- Zu den Hauptaufgaben der Serverschnittstelle gehören:
- Event-Loop-Schnittstelle
- Die Event-Loop-Schnittstelle ist ein impliziter Teil des ASGI-Protokolls. Sie wird vom ASGI-Server verwaltet und nicht direkt vom ASGI-Protokoll definiert.
- Die Event-Loop ist für die Planung und Ausführung asynchroner Aufgaben verantwortlich, was den Kern der asynchronen Programmierung darstellt. Zu ihren Hauptfunktionen gehören:
- Ausführen und Planen asynchroner Aufgaben.
- Verwalten asynchroner I/O-Operationen, wie z. B. Netzwerkanfragen.
- Behandeln von Callback-Funktionen und asynchronen Generatoren.
- In ASGI wird die Event-Loop normalerweise von den folgenden Python-Bibliotheken bereitgestellt:
- asyncio: Ein asynchrones I/O-Framework in der Python-Standardbibliothek.
- uvloop: Eine asynchrone Event-Loop basierend auf
libuv, die häufig mit dem Uvicorn-Server verwendet wird.
ASGI-Server und -Anwendungen verlassen sich auf die Event-Loop, um asynchrone Operationen auszuführen, wodurch sie eine große Anzahl gleichzeitiger Verbindungen effizient verarbeiten können.
ASGI-Ereignisse
Das ASGI-Ereignis-gesteuerte Modell verwaltet das Lebenszyklusmanagement (Start und Stopp), die HTTP-Anfragebehandlung und das WebSocket-Verbindungsmanagement. Durch verschiedene Arten von Ereignissen können Entwickler Verbindungen und Datenflüsse präzise steuern, um asynchrone und gleichzeitige Verarbeitung zu erreichen.
- Lebensdauerereignisse
- Lebensdauerereignisse beziehen sich auf die Start- und Stoppzyklen einer ASGI-Anwendung. Sie werden typischerweise verwendet, um Initialisierungs- und Bereinigungsaufgaben durchzuführen.
- lifespan.startup
- lifespan.shutdown
- Lebensdauerereignisse beziehen sich auf die Start- und Stoppzyklen einer ASGI-Anwendung. Sie werden typischerweise verwendet, um Initialisierungs- und Bereinigungsaufgaben durchzuführen.
- HTTP-Ereignisse
- Die ASGI-Behandlung von HTTP-Anfragen ist in mehrere Ereignisse unterteilt, die die Verwaltung der Details jeder HTTP-Anfrage ermöglichen.
- http.request
- http.response.start
- http.response.body
- http.disconnect
- websocket.send
- Die ASGI-Behandlung von HTTP-Anfragen ist in mehrere Ereignisse unterteilt, die die Verwaltung der Details jeder HTTP-Anfrage ermöglichen.
- WebSocket-Ereignisse
- ASGI unterstützt WebSocket-Verbindungen und ermöglicht so eine Zwei-Wege-Kommunikation.
- websocket.connect
- websocket.receive
- ASGI unterstützt WebSocket-Verbindungen und ermöglicht so eine Zwei-Wege-Kommunikation.
ASGI-Lebenszyklus
Der ASGI-Anwendungslebenszyklus bezieht sich auf die Phasen, die die Anwendung während des Starts und Stopps durchläuft. Er wird über den Lebensdauerereigniskanal verwaltet.
scope['type']: lifespanmessage['type']: Nachricht für Start und Stopp:lifespan.startup/lifespan.shutdown- Sendetyp:
{'type': 'lifespan.shutdown.complete'}
Der ASGI-Lebenszyklus ist in zwei Teile unterteilt: den Start und Stopp der Anwendung sowie den Aufbau, die Verarbeitung, die Antwort und den Stopp von Anfragen.
Uvicorn und die Anwendungsschicht
Wie bereits erwähnt, implementiert Uvicorn die ASGI-Serverschicht. Sie ist jedoch auf der Anwendungsschicht nicht sehr benutzerfreundlich, da sie zu Low-Level ist. Daher sind viele Frameworks höherer Ebene entstanden:
- Starlette: Ein leichtgewichtiges ASGI-Framework/Toolkit zum Erstellen von hochleistungsfähigen Webdiensten. Es ist eine Basiskomponente von FastAPI und kann auch unabhängig zum Erstellen einfacher Webanwendungen verwendet werden.
- FastAPI: Ein modernes, schnelles (High-Performance) Webframework zum Erstellen von APIs, das mit Python 3.6+ Type-Hints verwendet wird. Es basiert auf Starlette und Standard-Python-Type-Hints und bietet automatische Datenvalidierung und -Serialisierung sowie interaktive API-Dokumentationsgenerierung.
Es besteht keine Notwendigkeit, hier auf andere Aspekte einzugehen; zu viele Informationen können überwältigend sein. Uvicorn benötigt eine app, daher ist für diese beiden Frameworks das instanziierte Objekt app. Dann verwenden wir die Uvicorn-CLI, um die Anwendung zu starten:
uvicorn main:app --reload
Zusammenfassung
Dieser Artikel untersucht hauptsächlich das Python-Web-ASGI-Protokoll über Uvicorn. ASGI ist die asynchrone Server-Gateway-Schnittstelle von Python, die die asynchronen, gleichzeitigen und Multi-Protokoll-Funktionen moderner Python-Webprogramme integriert.
Leapcell: Die beste serverlose Plattform für Python-Webhosting, asynchrone Aufgaben und Redis

Abschließend empfehle ich eine Plattform, die sich am besten für die Bereitstellung von Python-Projekten eignet: Leapcell
1. Multi-Sprachen Unterstützung
- Entwickeln Sie mit JavaScript, Python, Go oder Rust.
2. Stellen Sie unbegrenzt Projekte kostenlos bereit
- Zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
3. Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 US-Dollar unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
4. Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und Protokollierung für verwertbare Erkenntnisse.
5. Mühelose Skalierbarkeit und Hochleistung
- Auto-Skalierung zur einfachen Bewältigung hoher Parallelität.
- Null Betriebsaufwand – konzentrieren Sie sich einfach auf den Aufbau.

Erfahren Sie mehr in der Dokumentation!
Leapcell Twitter: https://x.com/LeapcellHQ

