Kotlin 协程里 Job.cancel() 和 Scope.cancel() 到底差在哪?
`Job.cancel()` 和 `Scope.cancel()` 都能取消 Kotlin 协程,但两者面向的对象、影响范围和后续可用性完全不同。本文从作用范围、示例代码、内部实现到 ViewModel 等实际场景,梳理两者该如何选、何时该整组回收、何时只停掉单个任务。
2026-08-22
154
`Job.cancel()` 和 `Scope.cancel()` 都能取消 Kotlin 协程,但两者面向的对象、影响范围和后续可用性完全不同。本文从作用范围、示例代码、内部实现到 ViewModel 等实际场景,梳理两者该如何选、何时该整组回收、何时只停掉单个任务。

`RuntimeError: Event loop is closed` 往往不是单点报错,而是事件循环生命周期已经失控。问题常见于 `asyncio.run()` 后继续复用 loop、跨线程误传 loop,或异步资源在 loop 关闭后才释放。本文按成因、修复方式和排查步骤梳理处理方法。 在 Python 异步开发里,`RuntimeError: Event loop is closed` 往往不是偶发异常,而是事件循环已经被关闭,后续代码却还在继续使用它。

本文围绕 Kotlin 协程里最容易误判的一点展开:为什么同样是子协程失败,`Job` 与 `SupervisorJob` 在 `join()` 上的表现完全不同。文章用对比示例、处理方式和适用场景,把异常传播、失败隔离和实际写法一次讲清。

这篇文章围绕 kotlinx.coroutines 的官方能力展开,重新梳理了协程框架组成、四种启动模式、常用调度器,以及取消与超时处理的关键细节。读完后可以更快判断:协程什么时候会真正执行、该放到哪个调度器,以及没有挂起点时该怎样补上取消响应。
