Sobes.tech
Middle

Kā scope seko korutīnas atcelšanai?

sobes.tech AI

Atbilde no AI

Scope seko korutīnas atcelšanai, izmantojot Job objektu. Katrs CoroutineScope ir tam saistītais Job.

Kad tiek izveidota jauna korutīna CoroutineScope iekšienē, tā saņem Job no šī scope kā vecāka Job.

Atcelšanas uzraudzības mehānisms darbojas šādi:

  1. Scope atcelšana: Kad tiek izsaukts cancel() uz Job scope, tas rekursīvi atceļ visus savus bērnu Job.
  2. Bērnu korutīnu atcelšana: Kad bērna korutīna (piemēram, caur withContext(NonCancellable)) vai neapstrādāta izņēmuma gadījumā, tā paziņo par to savam vecāka Job. Vecāka Job (scope) savukārt var atcelt citus savus bērnu Job.
  3. Kooperatīva atcelšana: Korutinas ir kooperatīvas attiecībā uz atcelšanu. Tas nozīmē, ka korutinas kods regulāri pārbauda, vai tā ir atcelta, lai pareizi pabeigtu savu darbu. Standarta suspendētās funkcijas (piemēram, delay, I/O operācijas) automātiski pārbauda Job stāvokli.

Kods var tieši pārbaudīt atcelšanu, izmantojot isActive vai ensureActive():

// Korutinas aktivitātes pārbaudes piemērs
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Veicam kādu ilgstošu operāciju
            delay(100) // suspend punkts - automātiski pārbauda atcelšanu

            // Vai tieši pārbaudām
            if (!isActive) {
                break // izeja no cikla atcelšanas gadījumā
            }
        }
        println("fetchData korutina pabeigta")
    }
}

ensureActive() izmantošana izmet CancellationException atcelšanas gadījumā:

// `ensureActive()` izmantošana
suspend fun processData() {
    // ... darbi ...
    ensureActive() // Izmet `CancellationException`, ja korutina ir atcelta
    // ... turpina darbu tikai ja korutina ir aktīva ...
}

CancellationException ir standarta veids, kā izplatīt atcelšanas signālu. To nevajadzētu uzskatīt par kļūdu korutīnu kontekstā.

Scope, kam ir Job, veido hierarhiju "vecāks-auglis" Job, kas ļauj izplatīt atcelšanas signālu no vecāka uz bērniem. Šis ir strukturālā paralelizma pamats korutinās.