Lektion 34 von 35Python
Python · Lektion 34 · 30 Minuten
async und await
Das lernst du
- Verstehen, was „gleichzeitig warten“ bedeutet
- Mit
asyncdef,awaitundasyncio.runarbeiten - Mehrere Aufgaben mit
asyncio.gatherparallel 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
asynciomit 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:
asynclohnt 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())- Denkanstoß
Ersetze die drei
await-Zeilen durch einawaitasyncio.gather(aufgabe(...), aufgabe(...), aufgabe(...)). - Lückencode – ergänze die ___
import asyncio async def aufgabe(name, sekunden): await asyncio.sleep(sekunden) print(f"{name} fertig") async def main(): # alle drei gleichzeitig starten ___ ___ ___ ___ ___ print("Gesamtzeit:", asyncio.zeit()) asyncio.run(main())
Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.
Lösung anzeigen🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
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())