非同期チャネルを作成しようとしていますが、http://golang.org/ref/spec#Making_slices_maps_and_channelsを見てきました。
c := make(chan int, 10) // channel with a buffer size of 10
バッファサイズが10とはどういう意味ですか?バッファサイズは具体的に何を表しますか/制限しますか?
非同期チャネルを作成しようとしていますが、http://golang.org/ref/spec#Making_slices_maps_and_channelsを見てきました。
c := make(chan int, 10) // channel with a buffer size of 10
バッファサイズが10とはどういう意味ですか?バッファサイズは具体的に何を表しますか/制限しますか?
回答:
バッファサイズは、送信をブロックせずにチャネルに送信できる要素の数です。デフォルトでは、チャネルのバッファサイズは0です(これはで取得できますmake(chan int)
)。これは、別のゴルーチンがチャネルから受信するまで、すべての送信がブロックされることを意味します。バッファサイズ1のチャネルは、ブロックを送信するまで1つの要素を保持できるため、次のようになります。
c := make(chan int, 1)
c <- 1 // doesn't block
c <- 2 // blocks until another goroutine receives from the channel
package main
import (
"fmt"
"time"
)
func receiver(ch <-chan int) {
time.Sleep(500 * time.Millisecond)
msg := <-ch
fmt.Printf("receive messages %d from the channel\n", msg)
}
func main() {
start := time.Now()
zero_buffer_ch := make(chan int, 0)
go receiver(zero_buffer_ch)
zero_buffer_ch <- 444
elapsed := time.Since(start)
fmt.Printf("Elapsed using zero_buffer channel: %v\n", elapsed)
restart := time.Now()
non_zero_buffer_ch := make(chan int, 1)
go receiver(non_zero_buffer_ch)
non_zero_buffer_ch <- 4444
reelapsed := time.Since(restart)
fmt.Printf("Elapsed using non zero_buffer channel: %v\n", reelapsed)
}
結果:
チャネルからメッセージ444を受信する
zero_bufferチャネルを使用して経過:505.6729ms
zero_buffer以外のチャネルを使用して経過:0秒