Zum Inhalt springen
BetaEN
Lektion 34 von 35Python

Python · Lektion 34 · 30 Minuten

async und await

Das lernst du

  • Verstehen, was „gleichzeitig warten“ bedeutet
  • Mit async def, await und asyncio.run arbeiten
  • Mehrere Aufgaben mit asyncio.gather parallel laufen lassen

Warten, ohne herumzustehen

Stell dir vor, du kochst Nudeln und backst gleichzeitig eine Pizza. Du stehst nicht 10 Minuten vor dem Topf und danach 15 Minuten vor dem Ofen – du startest beides und machst etwas anderes, bis eins fertig ist. Genau das ist asynchrones Programmieren.

Gut zu wissen: Auf Codelix läuft eine Lern-Version von asyncio mit einer simulierten Uhr: Die Reihenfolge ist wie in echtem Python, aber du musst nicht wirklich warten. asyncio.zeit() zeigt dir die simulierte Zeit – diese Funktion gibt es nur hier.

async def und await

Eine Funktion mit async def ist eine Coroutine. Mit await wartet sie auf etwas, ohne das ganze Programm zu blockieren. Gestartet wird alles mit asyncio.run():

import asyncio

async def kochen(gericht, minuten):
    print(f"{gericht} startet")
    await asyncio.sleep(minuten)
    print(f"{gericht} fertig nach {minuten} Minuten")

async def main():
    await kochen("Nudeln", 10)
    await kochen("Pizza", 15)
    print("Zeit insgesamt:", asyncio.zeit())

asyncio.run(main())

Hier wird noch nacheinander gekocht: 25 Minuten.

Gleichzeitig mit gather

asyncio.gather() startet mehrere Coroutinen auf einmal und wartet, bis alle fertig sind:

import asyncio

async def kochen(gericht, minuten):
    print(f"{gericht} startet")
    await asyncio.sleep(minuten)
    print(f"{gericht} fertig")
    return gericht

async def main():
    ergebnisse = await asyncio.gather(kochen("Nudeln", 10), kochen("Pizza", 15))
    print(ergebnisse)
    print("Zeit insgesamt:", asyncio.zeit())

asyncio.run(main())

Jetzt dauert alles nur noch so lange wie das längste Gericht: 15 Minuten.

Merke: async lohnt sich, wenn ein Programm viel wartet – auf das Internet, auf Dateien oder auf einen Roboter-Sensor. Zum schnelleren Rechnen hilft es nicht.

Kurz-Check

Bevor es an die Aufgabe geht: Was gibt dieses Programm aus? Tipp deine Vermutung ein – Python rechnet danach nach.

import asyncio


async def sagen(text, warten):
    await asyncio.sleep(warten)
    print(text)


async def main():
    await asyncio.gather(sagen("A", 0.2), sagen("B", 0.1))


asyncio.run(main())

Deine Aufgabe

Jetzt bist du dran

Ein Roboter soll drei Dinge gleichzeitig tun: Motor starten (2 Sekunden), Sensor kalibrieren (1 Sekunde) und Lichttest (3 Sekunden). Lass alle drei mit asyncio.gather parallel laufen. Danach soll asyncio.zeit() 3.0 ergeben – nicht 6.0 wie hintereinander.

import asyncio


async def aufgabe(name, sekunden):
    await asyncio.sleep(sekunden)
    print(f"{name} fertig")


async def main():
    # alle drei gleichzeitig starten
    await aufgabe("Motor", 2)
    await aufgabe("Sensor", 1)
    await aufgabe("Licht", 3)
    print("Gesamtzeit:", asyncio.zeit())


asyncio.run(main())

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:

import asyncio


async def aufgabe(name, sekunden):
    await asyncio.sleep(sekunden)
    print(f"{name} fertig")


async def main():
    # alle drei gleichzeitig starten
    await asyncio.gather(
        aufgabe("Motor", 2),
        aufgabe("Sensor", 1),
        aufgabe("Licht", 3),
    )
    print("Gesamtzeit:", asyncio.zeit())


asyncio.run(main())