Ответ
Корутины в Kotlin выполняются в рамках CoroutineScope, которая определяет их жизненный цикл и отмену. Иерархия существует через parent-child отношения:
- Родительская корутина автоматически отменяет все дочерние при отмене
- Дочерняя корутина может отменить родительскую только через явный вызов
CoroutineExceptionHandler
Пример:
val parentJob = CoroutineScope(Dispatchers.IO).launch {
val child1 = launch { /* ... */ }
val child2 = async { /* ... */ }
// при отмене parentJob отменятся child1 и child2
}
Исключения в дочерних корутинах также распространяются вверх по иерархии, если не обработаны. Структурная конкурентность обеспечивает управление этой иерархией.