缓冲通道在达到其容量时不会阻塞写入
buffered channel not blocking for write when reached its capacity
https://play.golang.org/p/5A-dnZVy2aA
func closeChannel(stream chan int) {
fmt.Println("closing the channel")
close(stream)
}
func main() {
chanOwner := func() <-chan int {
resultStream := make(chan int, 5)
go func() {
defer closeChannel(resultStream)
for i := 0; i <= 5; i++ {
resultStream <- i
}
}()
return resultStream
}
resultStream := chanOwner()
for result := range resultStream { //this blocks until the channel is closed
fmt.Printf("Received: %d\n", result)
}
fmt.Println("done receiving")
}
程序输出
closing the channel
Received: 0
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
done receiving
为什么在上述程序中 closing the channel
语句打印在任何 Received
之前。由于通道的缓冲容量为 5,并且我们要向其中插入 6 个元素,因此我希望它在读取值并清除缓冲区中的 space 之前在 resultStream <- i
处阻塞。
生成器 goroutine 将通道填充到其容量并阻塞。循环的接收器从通道接收第一个项目,这再次启用生成器 goroutine。在接收方 for-loop 可以打印 Received
消息之前,生成器 goroutine 运行完成,打印 closing the channel
消息。然后接收器循环接收所有剩余的消息。
https://play.golang.org/p/5A-dnZVy2aA
func closeChannel(stream chan int) {
fmt.Println("closing the channel")
close(stream)
}
func main() {
chanOwner := func() <-chan int {
resultStream := make(chan int, 5)
go func() {
defer closeChannel(resultStream)
for i := 0; i <= 5; i++ {
resultStream <- i
}
}()
return resultStream
}
resultStream := chanOwner()
for result := range resultStream { //this blocks until the channel is closed
fmt.Printf("Received: %d\n", result)
}
fmt.Println("done receiving")
}
程序输出
closing the channel
Received: 0
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
done receiving
为什么在上述程序中 closing the channel
语句打印在任何 Received
之前。由于通道的缓冲容量为 5,并且我们要向其中插入 6 个元素,因此我希望它在读取值并清除缓冲区中的 space 之前在 resultStream <- i
处阻塞。
生成器 goroutine 将通道填充到其容量并阻塞。循环的接收器从通道接收第一个项目,这再次启用生成器 goroutine。在接收方 for-loop 可以打印 Received
消息之前,生成器 goroutine 运行完成,打印 closing the channel
消息。然后接收器循环接收所有剩余的消息。