
结构化并发讲的是"任务属于谁",而 Job 是这套体系里真正干活的那一层:它记录任务状态、持有取消句柄、决定异常往哪传。上一节把作用域树画出来之后,自然要问一句——树上每根枝干到底是什么在撑着?答案就是 Job。更常见的问法是:普通Job和SupervisorJob差在哪、什么时候该用后者、用了之后异常又从哪冒出来。这一题答得好,靠的不是背 API,而是把"失败级联"这件事在真实业务里演算一遍。先把结论放在前面:Job是协程的身份与状态载体,普通Job之间是父子关系,子协程失败会把异常抛给父,父随之取消,连带所有兄弟;SupervisorJob切断这条传播链,子协程失败只影响自己。判据只有一条——任务之间是否互不相关。三路推荐位并行拉取、其中一个挂了不该让另外两路白跑,用SupervisorJob;三个分片必须凑齐才能渲染,少一个就整页不展示,用普通Job。机制拆解launch/async拿到的那个Job,本质是一个状态机。状态迁移大致是New → Active → Completing → Completed,取消则走New → Active → Cancelling → Cancelled。父 Job 之所以能取消子,是因为它内部持有一份子节点的句柄表,取消父时向下广播取消信号;子 Job 之所以能让父失败,是因为子完成