Was ist asynchrone Programmierung in Python?
Asynchrone Programmierung ist eine Methode, Code so zu schreiben, dass Aufgaben nicht sequenziell, sondern parallel oder ereignisgesteuert ablaufen, ohne den Hauptausführungsfaden zu blockieren. In der modernen Softwareentwicklung spielt die effiziente Nutzung von Ressourcen und Ausführungszeit eine entscheidende Rolle.
Asynchrone Programmierung ermöglicht:
- Schnellere Ausführung von Aufgaben
- Verbesserte Reaktionsfähigkeit von Programmen
- Ressourcenschonende Nutzung des Systems
Die wichtigsten Vorteile der Asynchronität
Anwendungsbereiche
Asynchrone Programmierung ist besonders nützlich für Ein-/Ausgabe-Operationen:
- Dateiverarbeitung
- Netzwerkanfragen (HTTP API)
- Datenbankinteraktionen
- WebSocket-Kommunikation
- Verarbeitung großer Datenmengen
Unterschiede zur Multithreading
Im Gegensatz zum Multithreading erfordert Asynchronität keine zusätzlichen Threads oder Prozesse. Dies reduziert die Systemlast und vermeidet Probleme mit Sperren und Datensynchronisation zwischen Threads.
Wie Asynchronität in Python funktioniert
Python bietet integrierte Unterstützung für asynchrone Programmierung durch das Modul asyncio, das offiziell ab Version 3.4 zur Standardbibliothek gehört.
Grundlegende Konzepte
async def— definiert eine asynchrone Funktion (Koroutine)await— wartet auf die Ausführung einer Koroutineasyncio— das Standardmodul für asynchrone Aufgabenevent loop— die Ereignisschleife, die die Ausführung der Koroutinen steuert
Einfaches Beispiel einer asynchronen Funktion
import asyncio
async def greet():
print("Hallo!")
await asyncio.sleep(1)
print("1 Sekunde ist vergangen")
asyncio.run(greet())
In diesem Beispiel simuliert await asyncio.sleep(1) das Warten auf eine aufwändige Operation, wie z.B. eine Netzwerkanfrage.
Asynchrone Funktionen erstellen und nutzen
Definition einer asynchronen Funktion
Verwende das Schlüsselwort async vor der Funktionsdefinition, um eine asynchrone Funktion zu erstellen:
async def fetch_data():
print("Daten werden angefordert...")
await asyncio.sleep(2)
print("Daten empfangen")
Aufruf einer asynchronen Funktion
Der Aufruf einer asynchronen Funktion erfolgt über asyncio.run():
asyncio.run(fetch_data())
Parallele Ausführung mehrerer Aufgaben
Verwendung von asyncio.gather()
Um mehrere Koroutinen parallel zu starten, verwende asyncio.gather():
async def task(name, delay):
print(f"Aufgabe {name} gestartet")
await asyncio.sleep(delay)
print(f"Aufgabe {name} abgeschlossen")
async def main():
await asyncio.gather(
task("A", 2),
task("B", 1),
task("C", 3)
)
asyncio.run(main())
Alternative Methoden zum Starten von Aufgaben
Neben asyncio.gather() kannst du auch folgende Methoden nutzen:
asyncio.create_task()— zum Erstellen einzelner Aufgabenasyncio.wait()— zum Warten auf den Abschluss von Aufgaben mit zusätzlichen Optionenasyncio.as_completed()— zum Abrufen von Ergebnissen, sobald sie verfügbar sind
Asynchrone Iteratoren und Generatoren
Erstellen eines asynchronen Iterators
Verwende asynchrone Iteratoren, um Datenströme asynchron zu verarbeiten:
class AsyncCounter:
def __init__(self, max_count):
self.max_count = max_count
s