Middle
Kuidas scope jälgib korutina tühistamist?
sobes.tech AI
Vastus AI-lt
Scope jälgib korutina tühistamist, kasutades Job objekti. Iga CoroutineScope on seotud oma Job-iga.
Kui CoroutineScope sees luuakse uus korutina, see saab Job-i sellest scope'ist kui vanem-Job.
Tühistamise jälgimise mehhanism töötab järgmiselt:
- Scope'i tühistamine: Kui
cancel()kutsutakseJobscope'ile, see rekursiivselt tühistab kõik oma lapsedJob-id. - Laste korutinate tühistamine: Kui lapse korutina (näiteks
withContext(NonCancellable)kaudu) või tekib töötlemata erind, teatab see sellest oma vanem-Job-ile. Vanem-Job(scope) võib seejärel tühistada teisi oma lapsiJob-e. - Kooperatiivne tühistamine: Korutinaid peavad olema kooperatiivsed tühistamise suhtes. See tähendab, et korutina kood peab regulaarselt kontrollima, kas see on tühistatud, et lõpetada oma töö korrektselt. Tavalised suspend-funktsioonid (näiteks
delay, I/O operatsioonid) kontrollivad automaatseltJob-i olekut.
Kood võib otseselt kontrollida tühistamist isActive või ensureActive() abil:
// Korutina aktiivsuse kontrollimise näide
suspend fun fetchData() = coroutineScope {
launch {
while (isActive) {
// Teeme mõnda pikka operatsiooni
delay(100) // suspend punkt - kontrollib automaatselt tühistamist
// Või kontrollime otseselt
if (!isActive) {
break // väljumine tsüklist tühistamise korral
}
}
println("fetchData korutina lõpetas")
}
}
ensureActive() kasutamine viskab CancellationException tühistamise korral:
// `ensureActive()` kasutamine
suspend fun processData() {
// ... töö ...
ensureActive() // viskab `CancellationException`, kui korutina on tühistatud
// ... töö jätkub ainult kui korutina on aktiivne ...
}
CancellationException on standardne viis tühistamise signaali levitamiseks. Seda ei tohiks käsitleda kui viga korutinas.
Scope, millel on Job, loob hierarhia "vanem-laps" Job, mis võimaldab levitada tühistamise signaali vanemalt lastele. See on struktuurse paralleelsuse alus korutinates.