5.12.2 协程

原文链接: https://kotlinlang.org/docs/coroutines-overview.html

5.12.2 协程

应用经常需要同时执行多个任务,例如响应用户输入、加载数据或刷新界面。为支持这一点,它们依赖并发,让各个操作能够独立运行而互不阻塞。

并发执行任务最常见的方式是使用线程,它是由操作系统管理的独立执行路径。不过线程相对较重,创建大量线程可能导致性能问题。

为支持高效的并发,Kotlin 使用围绕协程构建的异步编程模型,让你可以用挂起函数以自然、顺序的风格编写异步代码。协程是线程的轻量级替代方案。它们可以在不阻塞系统资源的情况下挂起,对资源友好,因此更适合细粒度的并发。

大多数协程功能由 kotlinx.coroutines 库提供,其中包括用于启动协程、处理并发、处理异步流等工具。

如果你刚开始接触 Kotlin 中的协程,请先阅读协程基础指南,然后再深入了解更复杂的话题。该指南通过简单的示例介绍挂起函数、协程构建器和结构化并发等关键概念:

开始使用协程

提示: 可以看看 KotlinConf 应用这个示例项目,了解协程在实际中的用法。

协程概念

kotlinx.coroutines 库提供了并发运行任务、组织协程执行以及管理共享状态的核心构件。

挂起函数与协程构建器

Kotlin 中的协程建立在挂起函数之上,后者允许代码在不阻塞线程的情况下暂停和恢复。suspend 关键字用于标记可以异步执行长时间运行操作的函数。

要启动新的协程,请使用 .launch() 和 .async() 这类协程构建器。这些构建器是 CoroutineScope 上的扩展函数,后者定义了协程的生命周期并提供协程上下文。

你可以在协程基础和组合挂起函数中进一步了解这些构建器。

协程上下文与行为

从 CoroutineScope 启动协程会创建一个管辖其执行的上下文。像 .launch() 和 .async() 这样的构建器函数会自动创建一组元素来定义协程的行为:

这些元素以及其他可能的元素共同构成协程上下文,它默认从协程的父级继承。该上下文形成一种层级结构,从而支持结构化并发:相关的协程可以一起被取消,或作为一个组处理异常。

异步流与共享可变状态

Kotlin 提供了多种让协程相互通信的方式。请根据你希望在协程之间共享值的方式选择其中一种:

  • Flow 仅在协程主动收集时才产生值。
  • Channel 允许多个协程发送和接收值,每个值只会被投递给一个协程。
  • SharedFlow 会持续把每个值共享给所有正在收集的协程。

当多个协程需要访问或更新同一份数据时,它们就共享可变状态。如果缺乏协调,这可能导致竞态条件,使各个操作以不可预测的方式相互干扰。要安全地管理共享可变状态,可以用 StateFlow 包装共享数据。然后你就可以在一个协程中更新它,并从其他协程收集它的最新值。

更多信息请参阅流、通道以及协程与通道教程。

接下来学什么