Sobes.tech
Middle

Hogyan követi a scope a coroutine törlését?

sobes.tech MI

Válasz az MI-től

A Scope a Job segítségével követi egy coroutine törlését. Minden CoroutineScope-nak van egy hozzárendelt Job-ja.

Amikor egy új coroutine-t hozunk létre egy CoroutineScope-on belül, akkor az megkapja ennek a scope-nak a Job-ját mint szülő Job-ját.

A törlés követésének mechanizmusa a következőképpen működik:

  1. Scope törlése: Amikor a cancel() hívásra kerül a scope Job-ján, az rekurzívan törli az összes gyermek Job-ját.
  2. Gyermek coroutine törlése: Gyermek coroutine törlése (például withContext(NonCancellable)-en keresztül) vagy nem kezelt kivétel esetén, az értesíti a szülő Job-ját. A szülő Job (a scope-é) viszont más gyermek coroutine-okat is törölhet.
  3. Kooperatív törlés: A coroutine-oknak kooperatív módon kell viselkedniük a törléssel szemben. Ez azt jelenti, hogy a coroutine belsejében a kódnak időszakosan ellenőriznie kell, hogy törölték-e, hogy helyesen tudja befejezni a munkáját. A suspend függvények (például delay, I/O műveletek) automatikusan ellenőrzik a Job állapotát.

A kód explicit módon ellenőrizheti a törlést az isActive vagy az ensureActive() segítségével:

// Coroutine aktivitásának ellenőrzése példája
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Valamilyen hosszú művelet végrehajtása
            delay(100) // szünetelési pont - automatikusan ellenőrzi a törlést

            // Vagy explicit ellenőrzés
            if (!isActive) {
                break // Kilépés a ciklusból törlés esetén
            }
        }
        println("fetchData coroutine befejeződött")
    }
}

Az ensureActive() használata CancellationException-t dob törlés esetén:

// ensureActive() használata
suspend fun processData() {
    // ... valamilyen munka ...
    ensureActive() // Dob egy CancellationException-t, ha a coroutine-t törölték
    // ... folytassa a munkát csak akkor, ha a coroutine aktív ...
}

A CancellationException a törlési jelzés terjesztésének szabványos módja. Nem szabad hibának tekinteni a coroutine-ok törlésének kontextusában.

A scope, amely rendelkezik egy Job-lal, hierarchiát hoz létre "szülő-gyermek"-ként a Job-ok között, ami lehetővé teszi a törlési jelzés terjesztését a szülőtől a gyermekek felé. Ez a strukturált párhuzamosság alapja a coroutine-okban.