2012-08-13 36 views

Trả lời

110

Kích thước bộ đệm là số phần tử có thể được gửi tới kênh mà không cần chặn gửi. Theo mặc định, kênh có kích thước bộ đệm là 0 (bạn nhận được điều này với make(chan int)). Điều này có nghĩa là mỗi lần gửi đơn sẽ chặn cho đến khi một goroutine khác nhận được từ kênh. Một kênh của kích thước bộ đệm 1 có thể chứa 1 phần tử cho đến khi gửi khối, do đó bạn sẽ nhận được

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

Câu trả lời hay. Hiệu quả Go có một chương tốt đẹp có tiêu đề "Concurrency" mở rộng trên các kênh. Rất khuyến khích: http://golang.org/doc/effective_go.html – Levi

+0

Im rối tung với điều này và làm cho (chan int, 1) cho phép 3 giá trị được chuyển vào kênh của tôi trước khi chặn (thử nghiệm nó với log.Printlns), và mặc định là cho phép 2 trước khi chặn. Bất kỳ ý tưởng nào tại sao: – Mauricio

+0

@Mauricio Nghe có vẻ khá lạ. Tôi chỉ thử nghiệm bằng cách sử dụng Go 1.8.3 tại địa phương, và cũng sử dụng chức năng "Try Go" tại https://golang.org, và trong cả hai trường hợp, nó vẫn hoạt động như được ghi lại trong câu trả lời của tôi. –

2

Các mã sau minh họa việc chặn các kênh unbuffered:

// 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) 

Bạn có thể chơi với mã here .

Các vấn đề liên quan