通道 (Channel)
源:协程通道指南
Channel 是协程间通信的管道。与 Flow 不同,它是热的,并且主要用于并发的数据传递。 你可以把它想象成一个 BlockingQueue,但它是非阻塞(挂起)的。
生产者-消费者模式
produce 构建器是启动生产者协程的最简方式。
kotlin
// 生产者
fun CoroutineScope.produceSquares() = produce {
for (x in 1..5) {
send(x * x) // 生产
}
}
// 消费者
for (y in produceSquares()) {
println(y) // 消费
}扇出与扇入 (Fan-out / Fan-in)
- 扇出 (Fan-out): 多个消费者监听同一个 Channel。任务会自动分发给空闲的消费者(负载均衡)。
- 扇入 (Fan-in): 多个生产者向同一个 Channel 发送数据。
mermaid
graph LR
P1[Producer 1] --> Channel
P2[Producer 2] --> Channel
Channel --> C1[Consumer 1]
Channel --> C2[Consumer 2]Channel vs Flow
| 特性 | Channel | Flow |
|---|---|---|
| 热/冷 | 热 (Hot)。即使没订阅,也会生产(这可能导致缓冲区溢出)。 | 冷 (Cold)。必须 collect 才开始。 |
| 订阅模型 | 点对点。一条消息只能被一个消费者拿走。 | 广播 (借助 SharedFlow)。或单播 (每次 collect 都是新的)。 |
| 场景 | 任务队列、事件总线 | 数据流变换、UI 状态观察 |