buffer channel 打印结果不确定
来源:11-1 channel

Dylan_liang
2020-04-23
func Worker(id int, c chan int) {
//for n := range c {
for {
fmt.Printf("Worker %d received %d
", id, <-c)
}
}
// createworker, return type chan
func CreateWorker(id int) chan<- int {
c := make(chan int)
go Worker(id, c)
return c
}
func ChanDemo() {
var channels [10]chan<- int
for i := 0; i < 10; i++ {
channels[i] = CreateWorker(i)
}
for i := 0; i < 10; i++ {
channels[i] <- 'a' + i
}
time.Sleep(time.Millisecond)
}
// buffer channel
func BufferChan() {
c := make(chan int, 4)
go Worker(1, c)
c <- 1
c <- 2
c <- 3
c <- 4
c <- 5
close(c)
//time.Sleep(time.Millisecond)
}
func main() {
// ChanDemo()
BufferChan()
}
代码如上,在使用缓存channel时,发现连续按运行,有时候可以打印出5行来,有时候打印只有一行,有时候完全打印不出来。这是什么原因呢?go的版本是1.13.4
写回答
1回答
-
ccmouse
2020-04-26
并发的程序的确有可能结果不稳定。因为用了buffered channel,导致发送数据不会阻塞,main函数有可能很快跑完,所以啥都打不出来也有可能。
虽然buffer是4,送了5个数据,可能认为至少打印一个,但其实不然,打印也要花时间,有可能来不及打印,程序就退出了00
相似问题