多协程启动的最优方式探讨:两种实现方案有何差异?
两种协程启动方式的差异及最优方案
核心差异
1. 协程层级与生命周期绑定
- 嵌套launch方式:内层的两个launch是外层
job1的子协程,生命周期完全绑定到job1:- 调用
job1.join()时,会自动等待job1本身以及所有子协程执行完成; - 若取消
job1,所有内层子协程会被自动取消。
- 调用
- 同级launch方式:
job1和job2是同一个Scope下的同级协程,互相独立:- 必须分别调用
job1.join()和job2.join()才能等待两个协程都完成; - 取消其中一个协程,不会影响另一个的执行(除非取消整个Scope)。
- 必须分别调用
2. 异常传播逻辑
- 嵌套launch方式:子协程的未捕获异常会直接传播给父协程
job1,导致job1失败,同时取消其他所有子协程,最终可能导致整个Scope的Job失败(若Scope无异常处理机制)。 - 同级launch方式:任意一个协程的未捕获异常会直接导致Scope的Job失败,进而取消所有同级协程(包括另一个launch)。若需隔离异常,创建Scope时需指定
SupervisorJob(),此时单个协程失败不会影响其他同级协程。
最优方案选择
没有绝对的“最优”,完全取决于业务场景:
- 如果是一个主任务拆分出多个子任务,要求子任务与主任务同生命周期(主任务取消则子任务全部取消,主任务完成需等所有子任务结束),优先用嵌套launch方式。
- 如果是多个独立并行任务,不需要互相绑定生命周期,或需单独控制每个任务的取消/异常,优先用同级launch方式;若要避免单个任务异常影响全局,记得给Scope搭配
SupervisorJob()。
内容的提问来源于stack exchange,提问作者Teddy Consultant
相关产品推荐
相关产品推荐

