Sobes.tech
Middle

Kaip scope stebi korutinos atšaukimą?

sobes.tech AI

Atsakymas iš AI

Scope stebių stebi korutinų atšaukimą naudodamas Job objektą. Kiekvienas CoroutineScope turi su juo susijusį Job.

Kuriant naują korutiną CoroutineScope viduje, ji gauna Job iš šio scope kaip tėvinį Job.

Atšaukimo stebėjimo mechanizmas veikia taip:

  1. Scope atšaukimas: Kai kviečiama cancel() Job scope, jis rekursyviai atšaukia visus savo vaiko Job.
  2. Vaikų korutinų atšaukimas: Kai vaiko korutina (pavyzdžiui, per withContext(NonCancellable)) arba įvyksta neapdorota išimtis, ji praneša apie tai savo tėvui Job. Tėvinis Job (scope) savo ruožtu gali atšaukti kitus savo vaiko Job.
  3. Kooperatyvus atšaukimas: Korutinos turi būti kooperatyvios atžvilgiu. Tai reiškia, kad korutinos viduje kodas turi periodiškai tikrinti, ar ji buvo atšaukta, kad galėtų tinkamai užbaigti savo darbą. Standartinės suspend funkcijos (pavyzdžiui, delay, I/O operacijos) automatiškai tikrina Job būseną.

Kodas gali aiškiai tikrinti atšaukimą naudodamas isActive arba ensureActive():

// Korutinos aktyvumo tikrinimo pavyzdys
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Atlikti kažkokią ilgą operaciją
            delay(100) // suspend taškas - automatiškai tikrina atšaukimą

            // Arba aiškiai tikriname
            if (!isActive) {
                break // išeiti iš ciklo atšaukimo metu
            }
        }
        println("fetchData korutina baigta")
    }
}

Naudojant ensureActive() išmetamas CancellationException atšaukimo metu:

// `ensureActive()` naudojimas
suspend fun processData() {
    // ... darbai ...
    ensureActive() // Išmes `CancellationException`, jei korutina atšaukta
    // ... tęsti darbą tik jei korutina aktyvi ...
}

CancellationException yra standartinis būdas skleisti atšaukimo signalą. Jo nereikėtų laikyti klaida korutinų kontekste.

Scope, turėdama Job, sukuria hierarchiją "tėvas-vaikas" Job, leidžiančią skleisti atšaukimo signalą nuo tėvo vaikams. Tai yra struktūrinio paralelizmo pagrindas korutinose.