Sobes.tech
Middle

Scope, coroutine'дун жок кылуусун кантип көзөмөлдөйт?

sobes.tech AI

AIден жооп

Scope корутинаны Job объектисинин жардамымен көзөмөлдөйт. Ар бир CoroutineScope менен байланышкан Job бар.

Жаңы корутинаны CoroutineScope ичинде түзгөндө, ал ошол scope'тун Job объектин алат жана аны ата-энесинин Job катары колдонулат.

Көзөмөлдөө механизми төмөнкүдөй иштейт:

  1. Scope'тун токтотулушу: Эгер Job scope'то cancel() чакырылса, ал рекурсивдүү түрдө бардык балдары Job'лорун токтотот.
  2. Балдар корутинанын токтотулушу: Балдар корутинаны (мисалы, withContext(NonCancellable) аркылуу) токтотуу же ишке ашпеген ката пайда болгондо, ал өзүнүн ата-энесинин Job'уна кабар берет. Ата-эне Job (scope) башка балдарынын Job'ун да токтотушу мүмкүн.
  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 иерархиясын түзөт, ал атадан балдарга токтотуу сигналын таратууга мүмкүндүк берет. Бул корутиндердеги структуралык параллелизмдин негизги бөлүгү болуп саналат.