[译] Coroutines: First things first

简介: [译] Coroutines: First things first

CoroutineScope(协程作用域)


CoroutineScope 可以帮助你追踪任何通过 launchasync 启动的协程。它们都是 CoroutineScope 的扩展函数。正在运行的协程可以通过调用 scope.cancel() 在任意时间点停止。


无论你在 App 的任何页面启动协程,并控制其生命周期,都应该创建 CoroutineScope 。在 Android 中,KTX 类库已经为特定的生命周期类提供了 CoroutineScope,例如 viewModelScopelifecycleScope


创建 CoroutineScope 时需要给构造函数提供 CoroutineContext(协程上下文) 参数。下面的代码演示了如何新建一个作用域和协程。

// Job 和 Dispatcher 合并在一起作为 CoroutineContext,稍后会进行说明
val scope = CoroutineScope(Job() + Dispatchers.Main)
val job = scope.launch {
    // 新协程
}
复制代码


Job


Job 代表了一个协程。通过 launchasync 启动的每一个协程,都会返回一个 Job 实例来唯一标识,并且管理该协程的生命周期。如上一节所示,你可以给 CoroutineScope 传递一个 Job 来控制它的生命周期。


CoroutineContext(协程上下文)


可以翻译成协程上下文。但我还是用英文吧。

CoroutineContext 是定义协程行为的一系列元素。它由以下几部分组成:

  • Job,管理协程的生命周期
  • CoroutineDispatcher,分发任务到合适的线程
  • CoroutineName,协程的名称,用于调试
  • CoroutineExceptionHandler,处理未捕获的异常,这是第三篇文章的内容


一个新协程的 CoroutineContext 是什么?我们已经知道会创建一个新的 Job 来帮助我们管理生命周期,剩下的元素将继承自它的父亲的 CoroutineContext (可能是另一个协程,或者是创建它的 CoroutineScope)。


由于 CoroutineScope 可以创建协程,并且你可以在一个协程内部创建多个协程。这就形成了一个隐式的层级结构。在下面的代码中,除了使用 CoroutineScope 创建新协程之外,还展示了如何在一个协程中创建多个协程。


val scope = CoroutineScope(Job() + Dispatchers.Main)
val job = scope.launch {
    // 这里的新协程的父亲是 scope
    val result = async {
        // 这里的新协程的父亲是上面的 scope.launch 启动的协程
    }.await()
}
复制代码


层级结构的根通常是 CoroutineScope 。我们可以把层级结构想象成下面这样:

image.png

Job 生命周期


Job 会经历以下生命周期:

New,   Active,  Completing, Completed,  Cancelling ,  Cancelled

通过 Job 的这几个属性可以获取它的状态:isActiveisCancelledisCompleted

image.png

Job lifecycle

当协程处于 Active 状态,失败或者取消都会让协程移动到 Cancelling 状态(isActive = false,  isCancelled = true)。当协程中的所有子协程都完成了任务,协程将会进入 Cancelled 状态 (isCompleted = true) 。


关于 Parent CoroutineContext


在协程的继承结构中,每一个协程都会有一个父亲,这个父亲可能是 CoroutineScope 或者另一个协程。 但是子协程最终的父 CoroutineContext 可能和其父亲原本的 CoroutineContext 不一样。


父 CoroutineContext 的计算公式如下:

Parent context = Defaults + 继承的 CoroutineContext + arguments

其中:

  • 其中一些元素具有默认值:CoroutineDispatcher 的默认值是 Dispatchers.DefaultCoroutineName的默认值是 coroutine
  • 继承的 CoroutineContext 是父亲的 CoroutineContext
  • 传递到协程构建器中的参数优先于继承自上下文的参数

注意:多个 CoroutineContext 可以通过 “+” 操作符合并。由于 CoroutineContext 包含一系列元素,当创建新的 CoroutineContext 时,“+” 右侧的元素将会覆盖左侧的元素。例如:(Dispatchers.Main, “name”) + (Dispatchers.IO) = (Dispatchers.IO, “name”)

image.png

通过此协程作用域创建的协程的 CoroutineContext 将至少包含上图中这些元素。CoroutineName 是灰色的,因为它是默认值。


现在我们知道一个新协程的父 CoroutineContext 是什么了。它自己的 CoroutineContext 实际上是这样的:

New coroutine context = parent CoroutineContext + Job()

通常上面的协程作用域创建一个新的协程:

val job = scope.launch(Dispatchers.IO) {
    //新协程
}
复制代码


那么它的父 CoroutineContext 和自己的 CoroutineContext 是什么样的呢?请看下面的图片。

image.png

注意上下两个 Job 并不是同一个实例,新协程总会得到一个新的 Job 实例。

最终的父 CoroutineContext 的协程调度器是 Dispatchers.IO,因为它被协程构建器中的参数覆盖了。(译者注:scope.launch(Dispatchers.IO)) 。


同时,注意父 CoroutineContext 中的 Job 实例就是 scope 的 Job 实例(红色),而传递到新协程的 CoroutineContext 中的 Job 是一个新的实例(绿色)。


在系列第三篇文章中我们将看到,CoroutineScope 可以拥有其他的 Job 实现类,SupervisorJob ,它会改变协程作用域的异常处理。因此,在这样的 CoroutineScope 中创建的子协程也将继承 SupervisorJob 类型的 Job 。但是,如果当父协程是另一个协程的时候,将总是 Job 类型。

现在你已经了解了协程的基础知识,在系列的后面两篇文章中学习更多 取消和异常 的知识吧!



相关文章
|
5天前
|
存储 弹性计算 缓存
阿里云服务器租赁费用:新版租赁收费标准及活动报价参考
本文更新了2026年阿里云全系列云服务器租赁活动报价,所有特惠资源均可前往阿里云活动中心选购,整体覆盖从个人入门到企业级高性能场景的全梯度需求。其中轻量应用服务器主打极致性价比,2核2G峰值200M带宽配置每日10点、15点限时抢购价仅38元/年,2核4G配置379元/年起;高性价比的经济型e实例、通用算力型u2i实例覆盖2核4G至4核32G全档位,适配开发测试与中小型企业业务;搭载英特尔至强6处理器的第九代c9i企业级实例算力较上代提升20%,支撑高并发生产环境,不同实例规格价差清晰,用户可根据自身业务负载与预算灵活选型。
1556 110
|
11天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1939 8
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
6天前
|
人工智能 程序员 API
Codex 接入 DeepSeek-V4-Flash:还能补上识图,提供两套方案
Codex 接入 DeepSeek-V4-Flash 怎么配?本文覆盖 CLI 与桌面端,再用 qwen3-vl-flash 补识图,两套方案可直接照做
|
5天前
|
编解码 人工智能 安全
2核4G/4核8G/8核16G阿里云服务器如何选择实例?经济型e、通用算力型u2i与计算型c9i选哪个?
本文介绍了阿里云2核4G、4核8G、8核16G三档主流配置下经济型e、通用算力型u2i和计算型c9i三种实例的最新活动价格与适用场景。同配置下三者价差显著,以2核4G为例,经济型e低至599.93元/年,计算型c9i则高达1742.08元/年。文章详细解析了各实例的性能定位:经济型e适合轻负载入门场景,u2i兼顾稳定算力与性价比,c9i凭借第9代至强处理器与芯片级安全能力支撑高性能业务。同时提示用户可叠加满减优惠券享受折上折,建议根据业务负载与预算综合决策。
526 112
|
18天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
2487 4
|
10天前
|
存储 人工智能 关系型数据库
阿里云AI产品与云产品最新组合套餐:Token Plan、AI coding及云服务器和建站等组合优惠价
阿里云推出全新“算力+模型+应用”一站式云与AI组合套餐活动,覆盖从个人开发者到中大型企业的全场景需求。核心亮点为分三档定价的Token Plan订阅服务,支持Qwen3.8-Max-Preview大模型调用,错峰时段最低可享0.2折优惠。活动同步推出AI Coding、智能体部署、云电脑托管、0代码建站等十余类场景化组合,搭配99元/年的普惠云服务器、88元/年的入门数据库等经典特惠产品,还为企业提供1V1定制化AI转型方案,大幅降低了不同用户群体拥抱AI的技术门槛与采购成本。
718 111
|
19天前
|
人工智能 JSON 安全
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
阿里云AI安全产品联动防御Fastjson攻击
2629 13
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
|
5天前
|
人工智能 JSON Shell
2026AI漫剧本地全开源方案(附各个软件模型链接),8G显卡也能流畅运行
这是一套完全本地化部署的AI漫剧生成技术链路:涵盖LLM剧本分镜生成、FLUX文生图(IP-Adapter人脸锁定)、StoryDiffusion时序连贯控制、LTX-2.3唇形同步视频生成,及ComfyUI全流程调度。零云端费用,仅耗硬件算力,单集2–4小时可产出竖屏短视频,适配抖音/B站分发。