Sobes.tech
Middle

Ako scope sleduje zrušenie coroutine?

sobes.tech AI

Odpoveď od AI

Scope sleduje zrušenie korutiny pomocou objektu Job. Každý CoroutineScope má s ním spojený Job.

Keď sa vytvorí nová korutina v rámci CoroutineScope, získa Job z tohto scope ako rodičovský Job.

Mechanizmus sledovania zrušenia funguje nasledovne:

  1. Zrušenie Scope: Keď sa zavolá cancel() na Job scope, rekurzívne zruší všetky svoje dcérske Job.
  2. Zrušenie dcérskej korutiny: Pri zrušení dcérskej korutiny (napríklad cez withContext(NonCancellable)) alebo pri vzniku nezachytenej výnimky, o tom informuje svojho rodičovského Job. Rodičovský Job (scope) môže následne zrušiť ďalšie svoje dcérske korutiny.
  3. Kooperatívne zrušenie: Korutiny by mali byť kooperatívne voči zrušeniu. To znamená, že vnútri korutiny by mal kód pravidelne kontrolovať, či bola zrušená, aby mohol správne ukončiť svoju prácu. Štandardné suspendované funkcie (napríklad delay, I/O operácie) automaticky kontrolujú stav Job.

Kód môže explicitne kontrolovať zrušenie pomocou isActive alebo ensureActive():

// Príklad kontroly aktivity korutiny
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Vykonávame nejakú dlhú operáciu
            delay(100) // suspend bod - automaticky kontroluje zrušenie

            // Alebo explicitne kontrolujeme
            if (!isActive) {
                break // Ukončenie slučky pri zrušení
            }
        }
        println("Korutina fetchData ukončená")
    }
}

Použitie ensureActive() vyhodí CancellationException pri zrušení:

// Použitie ensureActive()
suspend fun processData() {
    // ... nejaká práca ...
    ensureActive() // Vyhodí CancellationException, ak je korutina zrušená
    // ... pokračovanie práce len ak je korutina aktívna ...
}

CancellationException je štandardný spôsob šírenia signálu zrušenia. Nemal by sa považovať za chybu v kontexte zrušenia korút.

Scope, ktorý vlastní Job, vytvára hierarchiu "rodič-dieťa" Job, ktorá umožňuje šíriť signál zrušenia od rodiča k deťom. Toto je základná stavebná časť štrukturálneho paralelizmu v korutinách.