关于channel通道数据进出的问题
来源:11-1 channel

yangxinxin
2018-08-19
func main() {
a, b, c, d, e, f, g := 0, 0, 0, 0, 0, 0, 0 // 用于记录每次channel中还剩下的数据个数
buffered := make(chan int, 2)
go func() {
for {
time.Sleep(time.Millisecond) // 如果把这一行代码注释掉,结果就会发生变化
fmt.Printf("取出的一个数据是:%d,channel中剩余数据个数是:%d\n", <-buffered, len(buffered))
}
}()
buffered <- 1
a = len(buffered)
buffered <- 2
b = len(buffered)
buffered <- 3
c = len(buffered)
buffered <- 4
d = len(buffered)
buffered <- 5
e = len(buffered)
buffered <- 6
f = len(buffered)
buffered <- 7
g = len(buffered)
fmt.Println(a, b, c, d, e, f, g)
}
老师好,根据代码的运行结果,往buffered channel中发送数据,不一定非要满额后协程才会从中出数据,我理解的是channel的取数据和进数据是异步的,是这样吗?
1回答
-
ccmouse
2018-09-01
抱歉你的问题因为我也需要环境运行一下,所以耽搁比较久。
你的理解是对的。buffered channel的确不一定需要满,也就是我们看到的,去掉了sleep,他会比较快的被清空,这样我们系统的负担就会小一些。
channel的取数据和发数据,如果没有buffer的话其实是同步的。发的人会卡住,等到有人收才能继续下去。
但是加了buffer后,看起来就有点像异步了。只要他不满,发的人就不用等人接收。只要他不空,收的人立刻就能收到数据。当然,如果满了或是空了,还是会发生一方在等待的情况。
00
相似问题