[译] 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 类型。

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



相关文章
|
15天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
29152 101
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
4天前
|
应用服务中间件 API 网络安全
3分钟汉化OpenClaw,使用Docker快速部署启动OpenClaw(Clawdbot)教程
2026年全新推出的OpenClaw汉化版,是基于Claude API开发的智能对话系统本土化优化版本,解决了原版英文界面的使用壁垒,实现了界面、文档、指令的全中文适配。该版本采用Docker容器化部署方案,开箱即用,支持Linux、macOS、Windows全平台运行,适配个人、企业、生产等多种使用场景,同时具备灵活的配置选项和强大的扩展能力。本文将从项目简介、部署前准备、快速部署、详细配置、问题排查、监控维护等方面,提供完整的部署与使用指南,文中包含实操代码命令,确保不同技术水平的用户都能快速落地使用。
4024 0
|
10天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
5774 16
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
9天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
4174 9
|
11天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
5243 17
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
11天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
5711 5
|
13天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
7518 16
|
6天前
|
存储 人工智能 API
OpenClaw(Clawdbot)本地部署详细步骤与2026年OpenClaw一键部署官方教程参考
在AI办公自动化与智能代理工具日益普及的当下,OpenClaw作为原Clawdbot(曾用名Moltbot)迭代升级后的开源AI代理平台,凭借多渠道通信集成、大模型灵活调用及自动化任务执行等核心能力,成为个人处理日常事务与小型团队推进协作的得力助手。无论是追求数据自主可控的本地部署,还是倾向于7×24小时稳定运行的云端部署,用户都能找到适配的实现路径。2026年阿里云针对OpenClaw推出的预置镜像一键部署方案,更是大幅降低了云端使用门槛。本文将详细拆解OpenClaw的本地安装流程与阿里云快速部署步骤,同时补充注意事项与问题排查方法,助力不同需求的用户顺利搭建专属AI助手。
2065 1