【发布时间】:2017-09-13 17:16:01
【问题描述】:
这是我想做的一个例子
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 对我来说感觉很奇怪。有一个更好的方法吗?
【问题讨论】:
-
你可以增加缓冲区大小,这只会延迟问题,或者添加默认跳过备份的动物。对于这种情况,空的默认情况相当常见。
-
是的,这可能会让人觉得很奇怪,但这是做你想做的事情的最佳方式。
-
@JimB 这是一个繁忙的循环吗?每次循环迭代针对不同的消费者。
-
@Adrian:你是对的,出于某种原因,我将 hat 视为一个空的 for 循环。
-
“有一个空的默认值对我来说感觉很奇怪”。习惯就好了。