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:
- Scope atšaukimas: Kai kviečiama
cancel()Jobscope, jis rekursyviai atšaukia visus savo vaikoJob. - Vaikų korutinų atšaukimas: Kai vaiko korutina (pavyzdžiui, per
withContext(NonCancellable)) arba įvyksta neapdorota išimtis, ji praneša apie tai savo tėvuiJob. TėvinisJob(scope) savo ruožtu gali atšaukti kitus savo vaikoJob. - 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 tikrinaJobbū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.