Как scope отслеживает отмену корутины?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Scope отслеживает отмену корутины с помощью объекта Job. Каждый CoroutineScope имеет связанный с ним Job.
Когда создается новая корутина внутри CoroutineScope, она получает Job из этого scope в качестве родительского Job.
Механизм отслеживания отмены работает следующим образом:
- Отмена Scope: Когда вызывается
cancel()наJobscope, он рекурсивно отменяет всех своих дочернихJob. - Отмена Дочерней Корутины: При отмене дочерней корутины (например, через
withContext(NonCancellable)) или при возникновении необработанного исключения, она сообщает об этом своему родительскомуJob. РодительскийJob(scope'а) в свою очередь может отменить другие свои дочерние корутины. - Кооперативная Отмена: Корутины должны быть кооперативными по отношению к отмене. Это означает, что внутри корутины код должен периодически проверять, была ли она отменена, чтобы завершить свою работу корректно. Стандартные 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, которая позволяет распространять сигнал отмены от родителя к потомкам. Это краеугольный камень структурного параллелизма в корутинах.