行くにチャネルを有する非ブロック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
が私には奇妙に感じます。これを行うより良い方法はありますか?
バッファサイズを増やすことで、問題の発生を遅らせることも、バックアップされた動物をスキップするデフォルトを追加することもできます。このような場合、空のデフォルトのケースはかなり一般的です。 – captncraig
ええ、それは気分が悪いかもしれませんが、それはあなたがやろうとしていることをするための最善の方法です。 – captncraig
@JimBこれはビジーなループですか?各ループの反復は、異なる消費者を対象としています。 – Adrian