Назад к вопросам
Middle
71
questionbank

Как scope отслеживает отмену корутины?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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, которая позволяет распространять сигнал отмены от родителя к потомкам. Это краеугольный камень структурного параллелизма в корутинах.