Kako scope prati otkazivanje coroutine?
sobes.tech АИ
Одговор од АИ
Scope prati otkazivanje korutine pomoću objekta Job. Svaki CoroutineScope ima povezani Job.
Kada se kreira nova korutina unutar CoroutineScope, ona dobija Job tog scope-a kao svog roditeljskog Job.
Mehanizam praćenja otkazivanja funkcioniše na sledeći način:
- Otkazivanje Scope-a: Kada se pozove
cancel()naJobscope-a, on rekurzivno otkazuje sve svojeJob-ove dece. - Otkazivanje deteta korutine: Pri otkazivanju deteta korutine (npr. putem
withContext(NonCancellable)) ili u slučaju neobrađene izuzetke, ona o tome obaveštava svojJobroditelja. RoditeljskiJob(scope) zauzvrat može otkazati druge svoje deca korutine. - Kooperativno otkazivanje: Korutine treba da budu kooperativne u odnosu na otkazivanje. To znači da unutar korutine kod treba da periodično proverava da li je otkazana, kako bi pravilno završila svoj rad. Suspend funkcije (kao što su
delay, I/O operacije) automatski proveravaju stanjeJob-a.
Kod može eksplicitno proveravati otkazivanje pomoću isActive ili ensureActive():
// Primer provere aktivnosti korutine
suspend fun fetchData() = coroutineScope {
launch {
while (isActive) {
// Izvršavamo neku dugu operaciju
delay(100) // tačka suspendovanja - automatski proverava otkazivanje
// Ili eksplicitno proveravamo
if (!isActive) {
break // izlazak iz petlje pri otkazivanju
}
}
println("fetchData korutina završena")
}
}
Korišćenje ensureActive() baca CancellationException pri otkazivanju:
// Korišćenje ensureActive()
suspend fun processData() {
// ... neki rad ...
ensureActive() // baci CancellationException ako je korutina otkazana
// ... nastavak rada samo ako je korutina aktivna ...
}
CancellationException je standardni način za širenje signala otkazivanja. Ne treba ga smatrati greškom u kontekstu otkazivanja korutina.
Scope, posedovanjem Job, kreira hijerarhiju "roditelj-ćerka" Job-ova, koja omogućava širenje signala otkazivanja od roditelja ka deci. Ovo je temelj strukturiranog paralelizma u korutinama.