Sobes.tech
Middle

Cum urmărește scope anularea unei coroutine?

sobes.tech AI

Răspuns de la AI

Scope monitorizează anularea unei coroutine prin obiectul Job. Fiecare CoroutineScope are un Job asociat.

Când se creează o nouă coroutine în interiorul unui CoroutineScope, aceasta primește Job-ul din acel scope ca Job părinte.

Mecanismul de monitorizare a anulării funcționează astfel:

  1. Anularea Scope-ului: Când se apelează cancel() pe Job-ul scope-ului, acesta anulează recursiv toate Job-urile sale copil.
  2. Anularea unei Coroutine Copil: La anularea unei coroutine copil (de exemplu, prin withContext(NonCancellable)) sau în cazul unei excepții necontrolate, aceasta informează despre acest lucru Job-ul său părinte. Job-ul părinte (scope-ul) poate, la rândul său, să anuleze alte coroutine copil.
  3. Anularea Co-operatorie: Corutinele trebuie să fie cooperative în privința anulării. Aceasta înseamnă că, în interiorul coroutinei, codul trebuie să verifice periodic dacă a fost anulată pentru a-și termina corect munca. Funcțiile suspend (cum ar fi delay, operații de I/O) verifică automat starea Job-ului.

Codul poate verifica explicit anularea folosind isActive sau ensureActive():

// Exemplu de verificare a activității unei coroutine
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Execută o operație lungă
            delay(100) // punct de suspendare - verifică automat anularea

            // Sau verifică explicit
            if (!isActive) {
                break // Ieșire din buclă la anulare
            }
        }
        println("fetchData coroutine finalizată")
    }
}

Utilizarea ensureActive() aruncă o CancellationException la anulare:

// Utilizare ensureActive()
suspend fun processData() {
    // ... o muncă ...
    ensureActive() // Va arunca CancellationException dacă coroutine a fost anulată
    // ... continuarea muncii doar dacă coroutine este activă ...
}

CancellationException este modul standard de propagare a semnalului de anulare. Nu trebuie considerată o eroare în contextul anulării corutinelor.

Scope, deținând un Job, creează o ierarhie "părinte-copil" de Job, care permite propagarea semnalului de anulare de la părinte la copii. Aceasta este piatra de temelie a paralelismului structurat în corutine.