Skip to content

通道 (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

特性ChannelFlow
热/冷 (Hot)。即使没订阅,也会生产(这可能导致缓冲区溢出)。 (Cold)。必须 collect 才开始。
订阅模型点对点。一条消息只能被一个消费者拿走。广播 (借助 SharedFlow)。或单播 (每次 collect 都是新的)。
场景任务队列、事件总线数据流变换、UI 状态观察