Sobes.tech
Middle

Ինչպես է scope-ը հետևում coroutine-ի չեղարկմանը։

sobes.tech AI

Պատասխան AI-ից

Scope-ը հետևում է կասեցման գործառույթին Job օբյեկտի միջոցով: Ամեն CoroutineScope ունի իր հետ կապված Job:

Երբ ստեղծվում է նոր կորուստ CoroutineScope-ի ներսում, այն ստանում է Job-ը այդ scope-ից որպես ծնողական Job:

Մեկնաբանությունը հետևում է հետևյալ մեխանիզմին՝

  1. Scope-ի կասեցում: Երբ cancel() է կանչվում Job scope-ի վրա, այն ռեկուրսիվորեն կասեցնում է իր բոլոր դուստր Job-երը:
  2. Դուստր կորուստների կասեցում: Երբ դուստր կորուստը (օրինակ, withContext(NonCancellable)-ով) կամ անբացառիկ արտահայտություն է առաջանում, այն տեղեկացնում է իր ծնողական Job-ին: Ծնողական Job-ը (scope) իր հերթին կարող է կասեցնել իր մյուս դուստր կորուստները:
  3. Կոոպերատիվ կասեցում: Կորուսները պետք է լինեն կոոպերատիվ կասեցման նկատմամբ: Դա նշանակում է, որ կորուստի ներսում կոդը պետք է պարբերաբար ստուգի, արդյոք այն կասեցված է, որպեսզի կարողանա ճիշտ ավարտել իր աշխատանքը: Ստանդարտ suspend-ֆունկցիաները (օրինակ, delay, I/O գործողություններ) ավտոմատ կերպով ստուգում են Job-ի վիճակը:

Կոդը կարող է բացահայտորեն ստուգել կասեցումը isActive կամ ensureActive()-ով:

// Կորուսի ակտիվության ստուգման օրինակ
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Կատարում ենք ինչ-որ երկարատև գործողություն
            delay(100) // suspend կետ - ավտոմատ ստուգում է կասեցումը

            // Կամ բացահայտ ստուգում ենք
            if (!isActive) {
                break // Ելք ցիկլից կասեցման դեպքում
            }
        }
        println("fetchData կորուստը ավարտվեց")
    }
}

ensureActive()-ն նետում է CancellationException-ը կասեցման դեպքում:

// `ensureActive()`-ի օգտագործում
suspend fun processData() {
    // ... որոշ աշխատանք ...
    ensureActive() // Նետում է `CancellationException`, եթե կորուստը կասեցված է
    // ... աշխատանքը շարունակվում է միայն եթե կորուստը ակտիվ է ...
}

CancellationException-ը ստանդարտ միջոց է կասեցման ազդանշան տարածելու համար: Այն չպետք է դիտարկել որպես սխալ կորուստների կոնտեքստում:

Scope-ը, որը տիրապետում է Job-ին, ստեղծում է «հայր-որդի» Job հիերարխիա, որը թույլ է տալիս տարածել կասեցման ազդանշանը հորից դեպի զավակներ: Սա կառուցվածքային պարալելիզմի հիմքն է կորուտիներում։