Sobes.tech
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:

  1. Scope'i tühistamine: Kui cancel() kutsutakse Job scope'ile, see rekursiivselt tühistab kõik oma lapsed Job-id.
  2. 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 lapsi Job-e.
  3. 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 automaatselt Job-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.