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:
- Zrušenie Scope: Keď sa zavolá
cancel()naJobscope, rekurzívne zruší všetky svoje dcérskeJob. - 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éhoJob. RodičovskýJob(scope) môže následne zrušiť ďalšie svoje dcérske korutiny. - 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ú stavJob.
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.