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, яка дозволяє поширювати сигнал скасування від батька до нащадків. Це краєугольний камінь структурного паралелізму в корутинах.