协程进阶:选择 03. 在发送上选择 (onSend)

本篇解析 example-select-03.kt。探讨 select 如何决定数据该发送给谁。

1. 核心操作:onSend

select 不仅可以监听接收,也可以监听发送。onSend 子句用于将一个元素发送到一个可用的通道中。

特点:

  • 负载均衡:如果主通道正忙(缓冲区满),select 会尝试发送到备用通道。
  • 多路分流:它能自动将产出的数据分流到第一个准备好接收的通道中。

2. 代码解析

1
2
3
4
select<Unit> {
onSend(num) { /* 发送到主通道成功后的逻辑 */ }
side.onSend(num) { /* 发送到备用通道成功后的逻辑 */ }
}
  • 执行逻辑:生产者产出一个数,如果消费者 1 慢,消费者 2 快,这个数就会被发送给消费者 2。

3. 开发者感悟

onSend 是处理“拥塞控制”的有力武器。在 Android 的网络上传场景下,如果你有两个上传接口(如 Wi-Fi 和 5G),你可以用 select 尝试先发给响应更快的那个,从而实现动态的链路负载均衡。

,