Sobes.tech
Middle

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:

  1. Anulowanie Scope: Gdy wywołuje się cancel() na Job scope, to rekurencyjnie anuluje wszystkie swoje Job potomne.
  2. Anulowanie Korutyny Potomnej: Podczas anulowania korutyny potomnej (np. przez withContext(NonCancellable)) lub w przypadku nieobsłużonego wyjątku, informuje ona o tym swój Job nadrzędny. Nadrzędny Job (scope) może z kolei anulować inne swoje korutyny potomne.
  3. 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ą stan Job.

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.