Scope, coroutine'дун жок кылуусун кантип көзөмөлдөйт?
sobes.tech AI
AIден жооп
Scope корутинаны Job объектисинин жардамымен көзөмөлдөйт. Ар бир CoroutineScope менен байланышкан Job бар.
Жаңы корутинаны CoroutineScope ичинде түзгөндө, ал ошол scope'тун Job объектин алат жана аны ата-энесинин Job катары колдонулат.
Көзөмөлдөө механизми төмөнкүдөй иштейт:
- Scope'тун токтотулушу: Эгер
Jobscope'тоcancel()чакырылса, ал рекурсивдүү түрдө бардык балдарыJob'лорун токтотот. - Балдар корутинанын токтотулушу: Балдар корутинаны (мисалы,
withContext(NonCancellable)аркылуу) токтотуу же ишке ашпеген ката пайда болгондо, ал өзүнүн ата-энесининJob'уна кабар берет. Ата-энеJob(scope) башка балдарынынJob'ун да токтотушу мүмкүн. - Кооперативдүү токтотуу: Корутиналар
кооперативдүүболушу керек. Бул алардын токтотулушуна карата, корутинанын ичинде код үзгүлтүксүз текшерип турушу керек дегенди билдирет. Стандарттык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 иерархиясын түзөт, ал атадан балдарга токтотуу сигналын таратууга мүмкүндүк берет. Бул корутиндердеги структуралык параллелизмдин негизги бөлүгү болуп саналат.