我試圖創建一個異步通道,我一直在尋找http://golang.org/ref/spec#Making_slices_maps_and_channels。Golang - 什麼是通道緩衝區大小?
c := make(chan int, 10) // channel with a buffer size of 10
這是什麼意思,緩衝區大小是10?緩衝區大小具體表示/限制的是什麼?
我試圖創建一個異步通道,我一直在尋找http://golang.org/ref/spec#Making_slices_maps_and_channels。Golang - 什麼是通道緩衝區大小?
c := make(chan int, 10) // channel with a buffer size of 10
這是什麼意思,緩衝區大小是10?緩衝區大小具體表示/限制的是什麼?
緩衝區大小是可以發送到沒有發送阻止的通道的元素的數量。默認情況下,一個通道的緩衝區大小爲0(你可以通過make(chan int)
得到)。這意味着每個發送都會阻塞,直到另一個goroutine從該頻道收到。緩衝區大小1的通道可容納1元,直到發送塊,所以你會得到
c := make(chan int, 1)
c <- 1 // doesn't block
c <- 2 // blocks until another goroutine receives from the channel
好的答案。 Effective Go有一個很好的章節,標題爲「併發」,闡述了渠道。強烈建議:http://golang.org/doc/effective_go.html – Levi 2012-08-14 02:26:46
Im搞砸了這個和make(chan int,1)允許3個值在阻塞之前傳入我的頻道(用log.Printlns進行測試),並且默認是在阻塞之前讓2進入。任何想法爲什麼: – Mauricio 2017-06-13 22:35:35
@Mauricio這聽起來很奇怪。我剛剛在本地使用Go 1.8.3進行了測試,並且還使用了https://golang.org上的「Try Go」功能,並且在這兩種情況下,它的行爲仍然與我的答案中記錄的相同。 – 2017-06-14 23:30:18
下面的代碼說明無緩衝信道的阻塞:
// to see the diff, change 0 to 1
c := make(chan struct{}, 0)
go func() {
time.Sleep(2 * time.Second)
<-c
}()
start := time.Now()
c <- struct{}{} // block, if channel size is 0
elapsed := time.Since(start)
fmt.Printf("Elapsed: %v\n", elapsed)
您可以用代碼here玩。
請參閱[here](http://tour.golang.org/concurrency/2)以及 – 2014-12-09 04:01:33