Sobes.tech
Middle

Wie verfolgt der Scope die Abmeldung einer Coroutine?

sobes.tech KI

Antwort von AI

Der Scope verfolgt die Stornierung einer Coroutine mithilfe des Job-Objekts. Jeder CoroutineScope hat einen zugehörigen Job.

Wenn innerhalb eines CoroutineScope eine neue Coroutine erstellt wird, erhält sie den Job dieses Scopes als ihren übergeordneten Job.

Der Mechanismus zur Verfolgung der Stornierung funktioniert wie folgt:

  1. Scope-Stornierung: Wenn cancel() auf dem Job des Scopes aufgerufen wird, storniert dieser rekursiv alle seine Kind-Jobs.
  2. Stornierung eines Kind-Job: Beim Stornieren eines Kind-Job (z.B. durch withContext(NonCancellable)) oder bei unbehandelten Ausnahmen informiert es seinen Eltern-Job. Der Eltern-Job (des Scopes) kann wiederum andere Kind-Jobs stornieren.
  3. Kooperative Stornierung: Koroutinen sollten kooperativ in Bezug auf die Stornierung sein. Das bedeutet, dass im Code der Koroutine regelmäßig überprüft werden sollte, ob sie storniert wurde, um ihre Arbeit ordnungsgemäß abzuschließen. Die suspend-Funktionen (wie delay, I/O-Operationen) überprüfen den Job-Status automatisch.

Der Code kann die Stornierung explizit mit isActive oder ensureActive() überprüfen:

// Beispiel für die Überprüfung der Aktivität einer Koroutine
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Führe eine lange Operation aus
            delay(100) // Suspend-Punkt - überprüft automatisch die Stornierung

            // Oder explizit überprüfen
            if (!isActive) {
                break // Schleife bei Stornierung beenden
            }
        }
        println("fetchData Koroutine beendet")
    }
}

Die Verwendung von ensureActive() löst bei Stornierung eine CancellationException aus:

// Verwendung von ensureActive()
suspend fun processData() {
    // ... irgendeine Arbeit ...
    ensureActive() // Wirft CancellationException, wenn die Koroutine storniert wurde
    // ... Fortsetzung der Arbeit nur, wenn die Koroutine aktiv ist ...
}

CancellationException ist die Standardmethode, um das Stornierungssignal zu propagieren. Es sollte im Kontext der Koroutinen-Stornierung nicht als Fehler betrachtet werden.

Der Scope, der einen Job besitzt, erstellt eine Hierarchie "Eltern-Kind" von Job, die es ermöglicht, das Stornierungssignal vom Eltern- zum Kind-Job zu propagieren. Dies ist die Grundpfeiler für strukturierten Parallelismus in Koroutinen.