Scope чӣ гуна иҷрои бекор кардани coroutine-ро пайгирӣ мекунад?
sobes.tech AI
Ҷавоб аз 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, яка дозволяє поширювати сигнал скасування від батька до нащадків. Це краєугольний камінь структурного паралелізму в корутинах.