在 Go 中使用通道执行非阻塞 select 语句的首选方法是什么
What is the preferred approach to do non-blocking select statement with channels in Go
这是我想做的事的例子
func (zoo *Zoo) feedAnimals(food Food) {
for animal := range zoo.Animals {
select {
case animal.EatChan() <- food:
default: // Do nothing
}
}
}
动物的 EatChan
有一个小的缓冲区,有时 feedAnimals
的调用速率比某些动物可以消耗食物的速率更频繁。发生这种情况时,如果我在 select
块中省略 default
语句,select 语句将阻塞 for loop
并且其他饥饿的动物无法获得食物。所以我宁愿跳过吃饱的动物(即频道已达到其容量。)
然而,有一个空的 default
对我来说感觉很奇怪。有一个更好的方法吗?
However, having an empty default feels weird to me.
不应该。
Is there a better way to do this?
没有
你已经做得很好了。空默认值不是 "do nothing" 语句,而是 "don't block" 语句。这只是非阻塞 select 工作原理的语义。
这是我想做的事的例子
func (zoo *Zoo) feedAnimals(food Food) {
for animal := range zoo.Animals {
select {
case animal.EatChan() <- food:
default: // Do nothing
}
}
}
动物的 EatChan
有一个小的缓冲区,有时 feedAnimals
的调用速率比某些动物可以消耗食物的速率更频繁。发生这种情况时,如果我在 select
块中省略 default
语句,select 语句将阻塞 for loop
并且其他饥饿的动物无法获得食物。所以我宁愿跳过吃饱的动物(即频道已达到其容量。)
然而,有一个空的 default
对我来说感觉很奇怪。有一个更好的方法吗?
However, having an empty default feels weird to me.
不应该。
Is there a better way to do this?
没有
你已经做得很好了。空默认值不是 "do nothing" 语句,而是 "don't block" 语句。这只是非阻塞 select 工作原理的语义。