2017-09-12 25 views
1

行くにチャネルを有する非ブロック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が私には奇妙に感じます。これを行うより良い方法はありますか?

+3

バッファサイズを増やすことで、問題の発生を遅らせることも、バックアップされた動物をスキップするデフォルトを追加することもできます。このような場合、空のデフォルトのケースはかなり一般的です。 – captncraig

+3

ええ、それは気分が悪いかもしれませんが、それはあなたがやろうとしていることをするための最善の方法です。 – captncraig

+0

@JimBこれはビジーなループですか?各ループの反復は、異なる消費者を対象としています。 – Adrian

答えて

2

ただし、空の既定値を設定すると、私にとっては奇妙な感じがします。

すべきではありません。

これを行うより良い方法はありますか?

あなたはすでにそれを正しくやっています。空のデフォルトはdo nothingステートメントではなく、do not blockステートメントです。これは、非ブロック選択がどのように機能するかのセマンティクスに過ぎません。