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:
- Scope törlése: Amikor a
cancel()hívásra kerül a scopeJob-ján, az rekurzívan törli az összes gyermekJob-ját. - 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. - 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 aJobá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.