Sobes.tech
Middle

Как scope следи за отменянето на корутината?

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) // точка на спиране - автоматично проверява отменянето

            // Или явно проверяваме
            if (!isActive) {
                break // излизане от цикъла при отменяне
            }
        }
        println("fetchData корутината приключи")
    }
}

Използването на ensureActive() хвърля CancellationException при отменяне:

// Използване на ensureActive()
suspend fun processData() {
    // ... някаква работа ...
    ensureActive() // ще хвърли CancellationException ако корутината е отменена
    // ... продължаване на работата само ако корутината е активна ...
}

CancellationException е стандартният начин за разпространение на сигнала за отменяне. Не трябва да се разглежда като грешка в контекста на отменянето на корутините.

Scope, притежавайки Job, създава йерархия "родител-дете" на Job, която позволява разпространение на сигнала за отменяне от родителя към децата. Това е основата на структурирания паралелизъм в корутините.