Sobes.tech
Middle

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:

  1. Otkazivanje Scope-a: Kada se pozove cancel() na Job scope-a, on rekurzivno otkazuje sve svoje Job-ove dece.
  2. Otkazivanje deteta korutine: Pri otkazivanju deteta korutine (npr. putem withContext(NonCancellable)) ili u slučaju neobrađene izuzetke, ona o tome obaveštava svoj Job roditelja. Roditeljski Job (scope) zauzvrat može otkazati druge svoje deca korutine.
  3. 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 stanje Job-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.