Sobes.tech
Middle

Hoe volgt de scope de annulering van een coroutine?

sobes.tech AI

Antwoord van AI

Scope volgt de annulering van een coroutine via het Job-object. Elke CoroutineScope heeft een bijbehorend Job.

Wanneer een nieuwe coroutine wordt gemaakt binnen een CoroutineScope, krijgt deze de Job van dat scope als zijn Job-ouder.

Het mechanisme voor het volgen van annuleringen werkt als volgt:

  1. Scope annuleren: Wanneer cancel() wordt aangeroepen op de Job van de scope, annuleert deze recursief al zijn Job-kinderen.
  2. Annulering van een Kind-Coroutine: Bij het annuleren van een kind-coroutine (bijvoorbeeld via withContext(NonCancellable)) of bij een niet-behandelde uitzondering, informeert deze haar Job-ouder. De Job-ouder (van de scope) kan op haar beurt andere kind-coroutines annuleren.
  3. Coöperatieve annulering: Coroutines moeten coöperatief zijn ten opzichte van annulering. Dit betekent dat binnen de coroutine code periodiek moet controleren of deze is geannuleerd, zodat deze haar werk correct kan afsluiten. Suspend-functies (zoals delay, I/O-operaties) controleren automatisch de status van de Job.

De code kan expliciet de annulering controleren met isActive of ensureActive():

// Voorbeeld van controle van de activiteit van een coroutine
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Voer een lange operatie uit
            delay(100) // suspend-punt - controleert automatisch de annulering

            // Of expliciet controleren
            if (!isActive) {
                break // Uit de lus bij annulering
            }
        }
        println("fetchData coroutine voltooid")
    }
}

Het gebruik van ensureActive() werpt een CancellationException bij annulering:

// Gebruik van ensureActive()
suspend fun processData() {
    // ... wat werk ...
    ensureActive() // Werpt CancellationException als de coroutine is geannuleerd
    // ... vervolg van werk alleen als de coroutine actief is ...
}

CancellationException is de standaardmanier om het annuleringssignaal door te geven. Het moet niet worden beschouwd als een fout in de context van coroutine-onderbrekingen.

Scope, met een Job, creëert een hiërarchie van "ouder-kind"-Jobs die het mogelijk maakt om het annuleringssignaal van ouder naar kind te verspreiden. Dit is de hoeksteen van gestructureerde paralleliteit in coroutines.