coroutineScope 与 supervisorScope:Kotlin 协程作用域的核心区别
1、核心概念
在 Kotlin 协程中,coroutineScope 和 supervisorScope 是两个重要的作用域构建器,它们的主要区别在于异常处理策略。
2、coroutineScope
- 异常传播:当任何子协程抛出未捕获的异常时,会立即取消所有其他子协程,异常会向上传播
- 适用场景:任务之间相互依赖,需要确保所有任务都成功完成
- 特点:一损俱损,适合需要原子性操作的场景
3、supervisorScope
- 异常传播:当子协程抛出未捕获的异常时,不会影响其他子协程,异常不会自动向上传播
- 适用场景:任务之间相互独立,部分任务失败不影响整体
- 特点:各自为政,适合需要容错性的场景
4、代码示例对比
coroutineScope 示例:
coroutineScope {
launch { throw Exception("Task 1 failed") }
launch { println("Task 2 completed") }
}
// 输出:异常被抛出,Task 2 不会执行supervisorScope 示例:
supervisorScope {
launch { throw Exception("Task 1 failed") }
launch { println("Task 2 completed") }
}
// 输出:Task 2 completed,Task 1 的异常被忽略5、使用建议
- 任务相互依赖时使用 coroutineScope
- 任务相互独立时使用 supervisorScope
- UI 相关场景优先使用 supervisorScope
- 数据处理场景根据依赖关系选择
6、总结
coroutineScope 适合需要原子性操作的场景,supervisorScope 适合需要容错性的场景。理解它们的区别,可以帮助开发者构建更加健壮的协程代码。

