结构化并发未取消子协程:为何该Kotlin协程代码持续运行?
为什么结构化并发机制没取消已启动的子协程?
先看你贴的代码:
suspend fun main(): Unit = coroutineScope{ launch { while (true){ println("infinite loop") } } throw Exception() }
核心原因是Kotlin协程的取消是协作式的,结合coroutineScope的运行逻辑就能明白:
coroutineScope在块内抛出异常时,确实会立刻向所有子协程发送取消信号,但它会等待所有子协程真正终止后,才会把异常向上传播。- 你的子协程是个纯无限循环,里面没有任何会触发取消检查的代码——协程不会自动终止,必须主动检查自己的取消状态(比如调用
delay()、yield()这类挂起函数,或者手动访问isActive属性),才能响应取消信号。
这个循环里既没有挂起操作,也没检查isActive,所以它完全感知不到coroutineScope发来的取消指令,会一直运行下去。
要让它响应取消很简单,给循环加个取消检查就行:
launch { while (isActive) { // 每次循环都检查协程是否还处于活跃状态 println("infinite loop") yield() // 挂起函数,会触发取消检查 } }
这样当coroutineScope抛出异常时,子协程就能检测到取消信号,停止循环了。
内容的提问来源于stack exchange,提问作者Abhay P
相关产品推荐
相关产品推荐

