Cum urmărește scope anularea unei coroutine?
sobes.tech AI
Răspuns de la AI
Scope monitorizează anularea unei coroutine prin obiectul Job. Fiecare CoroutineScope are un Job asociat.
Când se creează o nouă coroutine în interiorul unui CoroutineScope, aceasta primește Job-ul din acel scope ca Job părinte.
Mecanismul de monitorizare a anulării funcționează astfel:
- Anularea Scope-ului: Când se apelează
cancel()peJob-ul scope-ului, acesta anulează recursiv toateJob-urile sale copil. - Anularea unei Coroutine Copil: La anularea unei coroutine copil (de exemplu, prin
withContext(NonCancellable)) sau în cazul unei excepții necontrolate, aceasta informează despre acest lucruJob-ul său părinte.Job-ul părinte (scope-ul) poate, la rândul său, să anuleze alte coroutine copil. - Anularea Co-operatorie: Corutinele trebuie să fie cooperative în privința anulării. Aceasta înseamnă că, în interiorul coroutinei, codul trebuie să verifice periodic dacă a fost anulată pentru a-și termina corect munca. Funcțiile suspend (cum ar fi
delay, operații de I/O) verifică automat stareaJob-ului.
Codul poate verifica explicit anularea folosind isActive sau ensureActive():
// Exemplu de verificare a activității unei coroutine
suspend fun fetchData() = coroutineScope {
launch {
while (isActive) {
// Execută o operație lungă
delay(100) // punct de suspendare - verifică automat anularea
// Sau verifică explicit
if (!isActive) {
break // Ieșire din buclă la anulare
}
}
println("fetchData coroutine finalizată")
}
}
Utilizarea ensureActive() aruncă o CancellationException la anulare:
// Utilizare ensureActive()
suspend fun processData() {
// ... o muncă ...
ensureActive() // Va arunca CancellationException dacă coroutine a fost anulată
// ... continuarea muncii doar dacă coroutine este activă ...
}
CancellationException este modul standard de propagare a semnalului de anulare. Nu trebuie considerată o eroare în contextul anulării corutinelor.
Scope, deținând un Job, creează o ierarhie "părinte-copil" de Job, care permite propagarea semnalului de anulare de la părinte la copii. Aceasta este piatra de temelie a paralelismului structurat în corutine.