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ě:
- Zrušení scope: Když je zavoláno
cancel()naJobscope, rekurzivně zruší všechny jehoJobpotomky. - 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ůjJobrodič. RodičovskýJob(scope) může na oplátku zrušit další své dětské korutiny. - 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í stavJob.
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.