Ответ
supervisorScope и coroutineScope — оба создают новую область видимости для корутин, но различаются обработкой ошибок:
- coroutineScope
Если дочерняя корутина падает с исключением, отменяются все остальные дочерние корутины и сама область.
coroutineScope {
launch { throw RuntimeException() } // отменит все корутины внутри scope
launch { delay(1000); println("Не выполнится") }
}
- supervisorScope
Исключение в одной дочерней корутине не влияет на другие.
supervisorScope {
launch { throw RuntimeException() } // не затронет другие корутины
launch { delay(1000); println("Выполнится") }
}
Где использовать:
supervisorScope— для независимых задач (например, несколько параллельных запросов, где один может упасть).coroutineScope— когда задачи связаны и отмена одной должна остановить другие.