3 回答
TA贡献1812条经验 获得超5个赞
您可以这样做,select但由于要发送的值只评估一次,如果两个通道都没有准备好,要发送的值将在可以发送时过时。
因此,添加一个default案例,如果没有任何通道准备好,您将在其中“睡眠”一点,然后再试一次(计算/获取更新的新值以发送)。通过休眠,您不会消耗 CPU 资源:
s := make(chan<- int, 5)
r := make(<-chan int)
for {
v := valueToSend() // Evaluated each time we try to send
select {
case s <- v:
fmt.Println("Sent value:", v)
case vr := <-r:
fmt.Println("Received:", vr)
default: // If none are ready currently, we end up here
time.Sleep(time.Millisecond * 1)
}
}
请注意,检查通道的长度或容量然后发送/接收不被认为是一个好的解决方案,因为在检查其长度/上限和您尝试发送/接收之间,通道可能未准备好,如下图所示:
if len(r) > 0 {
// r is ready to receive
// Optional other code here,
// meanwhile another goroutine might receive the value from r!
r <- // If other goroutine received from r, this will block!
}
TA贡献1966条经验 获得超4个赞
这是一个简单的选择:
select {
case s <- n:
// Successful send.
case n := <- r:
// Successful receive. Do something with n.
}
- 3 回答
- 0 关注
- 174 浏览
添加回答
举报