在 Go 语言高并发编程中,select
语句就像是站在十字路口的交通指挥员。当多个channel
(通道)同时向程序发出信号(发送或接收数据就绪时),select
必须公平、迅速地决定哪条道路通行。这个“公平”体现在哪里?
核心就在于:当多个case同时就绪时,每个case被选中的概率是均等的,防止任何通道被“饿死”。今天我们就来揭秘它背后的“公平调度”原理。
想象一个场景:
ch1 := make(chan int)
ch2 := make(chan int)
// 启动两个协程,不断发送数据
go func() { for { ch1 <- 1 } }()
go func() { for { ch2 <- 1 } }()
count1, count2 := 0, 0
// 持续从两个通道接收数据
for i := 0; i < 10000; i++ {
select {
case <-ch1:
count1++
case <-ch2:
count2++
}
}