2017-01-28 7 views
0

私は新しいですが、ポイントがありませんが、Goチャネルはバッファされた最大チャネルサイズで制限されているのはなぜですか?たとえば、私はこの理由はそこにあるので、Goチャネルがバッファサイズを制限する理由

channel := make(chan int, 100) 

のようなチャネルは、私がブロックせずにチャンネルに100個の以上の要素を追加することはできませんしますか?チャネルAPIはそれをサポートしていないため、動的にサイズ変更することはできません。

これは、無制限のセマフォと比較して利便性が欠けているため、言語のユニバーサル同期のサポートが1つのメカニズムで制限されているようです。例えば、一般化されたセマフォの値は、境界なしで増やすことができます。

答えて

0

バッファサイズは、送信ブロックなしでチャネルに送信できる要素の数です。デフォルトでは、チャンネルのバッファサイズは0です(これはmake(chan int)で得られます)。これは、チャンネルから別のゴルーチンが受信するまで、すべてのシングル送信がブロックされることを意味します。バッファサイズ1のチャネルあなたは私はあなたがより明確化のためにこれを見てお勧め

c := make(chan int, 1) 
c <- 1 // doesn't block 
c <- 2 // blocks until another goroutine receives from the channel 

を取得したいので、ブロックを送信するまで1つの要素を保持することができます: https://rogpeppe.wordpress.com/2010/02/10/unlimited-buffering-with-low-overhead/ http://openmymind.net/Introduction-To-Go-Buffered-Channels/

+0

私はバッファリングされたチャンネルの仕組みを理解しています。私の質問は、動的サイズのバッファとは対照的に、限られたバッファを持つように設計されている理由の詳細です。 IMOバッファリングされたチャンネルを使用している場合、ブロックせずに無制限の値を保持する方が理にかなっています – Curious

3

プログラムの一の成分であればその入力に追いつくことができない場合、システムのメモリが足りなくなりクラッシュしたために処理されないギガバイトのデータが生成されず、残りのシステムにバックプレッシャーをかける必要があります。

マシンには処理できるものに限界があるため、無制限のバッファーは実際にはありません。 Goでは、バッファされたチャネルのサイズを指定する必要があるため、プログラムが実際に必要として処理できるサイズのバッファについて考えることができます。実際に10億個のアイテムが必要で、それを処理できる場合は、大きなチャンネルを作成できます。しかし、ほとんどの場合、バッファサイズ0または1が実際に必要なものです。

関連する問題