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:
- Scope annuleren: Wanneer
cancel()wordt aangeroepen op deJobvan de scope, annuleert deze recursief al zijnJob-kinderen. - Annulering van een Kind-Coroutine: Bij het annuleren van een kind-coroutine (bijvoorbeeld via
withContext(NonCancellable)) of bij een niet-behandelde uitzondering, informeert deze haarJob-ouder. DeJob-ouder (van de scope) kan op haar beurt andere kind-coroutines annuleren. - 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 deJob.
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.