Sobes.tech
Middle

Jak scope sleduje zrušení coroutine?

sobes.tech AI

Odpověď od AI

Scope sleduje zrušení korutiny pomocí objektu Job. Každý CoroutineScope má s tím spojenou Job.

Když je uvnitř CoroutineScope vytvořena nová korutina, obdrží Job tohoto scope jako svůj rodičovský Job.

Mechanismus sledování zrušení funguje následovně:

  1. Zrušení scope: Když je zavoláno cancel() na Job scope, rekurzivně zruší všechny jeho Job potomky.
  2. Zrušení dětské korutiny: Při zrušení dětské korutiny (například přes withContext(NonCancellable)) nebo při neřešené výjimce o tom informuje svůj Job rodič. Rodičovský Job (scope) může na oplátku zrušit další své dětské korutiny.
  3. Kooperativní zrušení: Korutiny by měly být kooperativní vůči zrušení. To znamená, že v rámci korutiny by měl kód průběžně kontrolovat, zda byla zrušena, aby správně ukončila svou práci. Suspendované funkce (například delay, I/O operace) automaticky kontrolují stav Job.

Kód může explicitně kontrolovat zrušení pomocí isActive nebo ensureActive():

// Příklad kontroly aktivity korutiny
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Provádíme nějakou dlouhou operaci
            delay(100) // suspend bod - automaticky kontroluje zrušení

            // Nebo explicitně kontrolujeme
            if (!isActive) {
                break // ukončení smyčky při zrušení
            }
        }
        println("fetchData korutina dokončena")
    }
}

Použití ensureActive() vyvolá při zrušení výjimku CancellationException:

// Použití ensureActive()
suspend fun processData() {
    // ... nějaká práce ...
    ensureActive() // Vyvolá CancellationException, pokud byla korutina zrušena
    // ... pokračování práce pouze pokud je korutina aktivní ...
}

CancellationException je standardní způsob šíření signálu zrušení. Neměl by být považován za chybu v kontextu zrušení korutin.

Scope, který vlastní Job, vytváří hierarchii "rodič-dítěJob", což umožňuje šíření signálu zrušení od rodiče k dětem. To je základ strukturovaného paralelismu v korutinách.