关于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后,看起来就有点像异步了。只要他不满,发的人就不用等人接收。只要他不空,收的人立刻就能收到数据。当然,如果满了或是空了,还是会发生一方在等待的情况。

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程