Middle
Ինչպես է scope-ը հետևում coroutine-ի չեղարկմանը։
sobes.tech AI
Պատասխան AI-ից
Scope-ը հետևում է կասեցման գործառույթին Job օբյեկտի միջոցով: Ամեն CoroutineScope ունի իր հետ կապված Job:
Երբ ստեղծվում է նոր կորուստ CoroutineScope-ի ներսում, այն ստանում է Job-ը այդ scope-ից որպես ծնողական Job:
Մեկնաբանությունը հետևում է հետևյալ մեխանիզմին՝
- Scope-ի կասեցում: Երբ
cancel()է կանչվումJobscope-ի վրա, այն ռեկուրսիվորեն կասեցնում է իր բոլոր դուստրJob-երը: - Դուստր կորուստների կասեցում: Երբ դուստր կորուստը (օրինակ,
withContext(NonCancellable)-ով) կամ անբացառիկ արտահայտություն է առաջանում, այն տեղեկացնում է իր ծնողականJob-ին: ԾնողականJob-ը (scope) իր հերթին կարող է կասեցնել իր մյուս դուստր կորուստները: - Կոոպերատիվ կասեցում: Կորուսները պետք է լինեն կոոպերատիվ կասեցման նկատմամբ: Դա նշանակում է, որ կորուստի ներսում կոդը պետք է պարբերաբար ստուգի, արդյոք այն կասեցված է, որպեսզի կարողանա ճիշտ ավարտել իր աշխատանքը: Ստանդարտ 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 հիերարխիա, որը թույլ է տալիս տարածել կասեցման ազդանշանը հորից դեպի զավակներ: Սա կառուցվածքային պարալելիզմի հիմքն է կորուտիներում։