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

Jetzt habe ich zwei Varianten, die beide scheinbar "gleichzeitig" laufen aber ich verstehe trotzdem nicht so richtig, was der Unterschied ist. Hier sind die zwei Beispiele:

create_task

import asyncio
import time

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

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

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

gather

async def main():
    await asyncio.gather(
        say_hello(1),
        say_hello(2)
    )

Beides läuft in ca. 2 Sekunden – also wohl wirklich gleichzeitig. Aber was genau ist jetzt der Unterschied zwischen create_task() und gather()? Gibt es einen "richtigen" Weg? Oder macht das keinen Unterschied?
Und was wäre z. B., wenn ich später noch Tasks abbrechen oder überwachen will?

von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

Beide Varianten führen say_hello(1) und say_hello(2) parallel aus – also asynchron, nicht nacheinander. Daher dauern beide nur ~2 Sekunden.

syncio.gather(...)

  • Wird oft als bequeme Variante genutzt, wenn du mehrere Tasks gleichzeitig starten und einfach nur auf alle warten willst.
  • Du hast keinen direkten Zugriff auf einzelne Tasks.
  • Du bekommst alle Ergebnisse zusammen zurück, oder es wird eine Exception geworfen, wenn eine Task fehlschlägt (je nach return_exceptions-Parameter).
  • Du kannst keine Tasks abbrechen, während gather() läuft, es sei denn, du benutzt return_exceptions=True und arbeitest mit CancelledError.

asyncio.create_task(...)

  • Du erstellst explizit Task-Objekte und behältst die Kontrolle über sie.
  • Du kannst einzelne Tasks abbrechen (task.cancel())
  • Du kannst ihren Status abfragen (task.done(), task.cancelled(), task.exception())
  • Du kannst sie früher oder später awaiten
  • Du kannst sie zu Listen sammeln und flexibel kombinieren
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

255 Kommentare

11 Nutzer