Jak scope śledzi anulowanie korutyny?
sobes.tech AI
Odpowiedź od AI
Scope śledzi anulowanie korutyny za pomocą obiektu Job. Każdy CoroutineScope ma powiązany Job.
Gdy tworzona jest nowa korutyna w ramach CoroutineScope, otrzymuje ona Job tego scope jako swojego Job nadrzędny.
Mechanizm śledzenia anulowania działa w następujący sposób:
- Anulowanie Scope: Gdy wywołuje się
cancel()naJobscope, to rekurencyjnie anuluje wszystkie swojeJobpotomne. - Anulowanie Korutyny Potomnej: Podczas anulowania korutyny potomnej (np. przez
withContext(NonCancellable)) lub w przypadku nieobsłużonego wyjątku, informuje ona o tym swójJobnadrzędny. NadrzędnyJob(scope) może z kolei anulować inne swoje korutyny potomne. - Kooperatywne Anulowanie: Korutyny powinny być kooperatywne względem anulowania. Oznacza to, że w kodzie korutyny powinna ona okresowo sprawdzać, czy została anulowana, aby poprawnie zakończyć swoją pracę. Funkcje suspend (np.
delay, operacje I/O) automatycznie sprawdzają stanJob.
Kod może jawnie sprawdzać anulowanie za pomocą isActive lub ensureActive():
// Przykład sprawdzania aktywności korutyny
suspend fun fetchData() = coroutineScope {
launch {
while (isActive) {
// Wykonujemy jakąś długą operację
delay(100) // punkt zawieszenia - automatycznie sprawdza anulowanie
// Lub jawnie sprawdzamy
if (!isActive) {
break // wyjście z pętli przy anulowaniu
}
}
println("fetchData zakończyła działanie")
}
}
Użycie ensureActive() rzuca CancellationException przy anulowaniu:
// Użycie ensureActive()
suspend fun processData() {
// ... jakaś praca ...
ensureActive() // rzuci CancellationException jeśli korutyna została anulowana
// ... kontynuuj pracę tylko jeśli korutyna jest aktywna ...
}
CancellationException jest standardową metodą propagacji sygnału anulowania. Nie należy jej traktować jako błąd w kontekście anulowania korutyn.
Scope, posiadając Job, tworzy hierarchię "rodzic-dziecko" Job, co pozwala na propagację sygnału anulowania od rodzica do dzieci. To jest kluczowe dla strukturalnego równoległości w korutynach.