You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构化并发未取消子协程:为何该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:18:27