lima-city: Webhosting, Domains und Cloud
1 Pluspunkt 0 Minuspunkte

Ich versuche gerade, mich in das Thema async/await in Python einzuarbeiten, aber irgendwie verstehe ich nicht so richtig, wie das funktioniert. Ich habe ein Beispiel aus dem Internet genommen und ein bisschen angepasst:

import asyncio
import time

async def say_hello():
    print("Hello...")
    await asyncio.sleep(2)
    print("...World!")

async def main():
    await say_hello()
    await say_hello()

start = time.time()
asyncio.run(main())
print(f"Duration: {time.time() - start}")

Ich dachte eigentlich, dass beide Aufrufe von say_hello() gleichzeitig laufen sollten, aber sie scheinen nacheinander abzulaufen und das Programm braucht ca. 4 Sekunden.

Warum ist das so? Habe ich async falsch verstanden? Oder fehlt da was, damit es wirklich "parallel" läuft?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Was dir fehlt ist das gleichzeitige Starten mehrerer Tasks. Dein aktueller Code:

await say_hello()
await say_hello()

Das bedeutet: Warte auf say_hello() bis es komplett fertig ist, und erst danach starte den nächsten. Dadurch laufen die beiden Aufrufe nacheinander also nicht parallel oder asynchron. Wenn du möchtest, dass beide say_hello() Aufrufe gleichzeitig laufen, musst du sie als Tasks starten, z. B. mit asyncio.create_task().

import asyncio
import time

async def say_hello():
    print("Hello...")
    await asyncio.sleep(2)
    print("...World!")

async def main():
    task1 = asyncio.create_task(say_hello())
    task2 = asyncio.create_task(say_hello())
    await task1
    await task2

start = time.time()
asyncio.run(main())
print(f"Duration: {time.time() - start}")

asyncio.create_task() startet beide say_hello() Funktionen quasi gleichzeitig. Dann wartest du mit await darauf, dass beide fertig sind. Die beiden await asyncio.sleep(2) laufen nun parallel, also insgesamt dauert das Ganze nur ca. 2 Sekunden, nicht 4. await func() wartet, bis die Funktion fertig ist. Wenn du mehrere async-Funktionen gleichzeitig starten willst, nutze asyncio.create_task() oder asyncio.gather().

von (481 Punkte)  
Diese Community basiert auf dem Prinzip der Selbstregulierung. Beiträge werden von Nutzern erstellt, bewertet und verbessert – ganz ohne zentrale Moderation.

Wer hilfreiche Fragen stellt oder gute Antworten gibt, sammelt Punkte. Mit steigender Punktzahl erhalten Mitglieder automatisch mehr Rechte, zum Beispiel

  • Kommentare verfassen
  • Beiträge bewerten
  • Inhalte bearbeiten
  • Inhalte ausblenden

So entsteht eine Plattform, auf der sich Qualität durchsetzt – getragen von einer engagierten Gemeinschaft. Unser Ziel: Guter Inhalt. Für alle.

2.3k Fragen

2.8k Antworten

253 Kommentare

11 Nutzer