Asynchrone Programmierung in Python: asyncio & aiohttp Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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 Koroutine
  • asyncio — das Standardmodul für asynchrone Aufgaben
  • event 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 Aufgaben
  • asyncio.wait() — zum Warten auf den Abschluss von Aufgaben mit zusätzlichen Optionen
  • asyncio.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                

Blogs

Buchempfehlungen