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个数据,可能认为至少打印一个,但其实不然,打印也要花时间,有可能来不及打印,程序就退出了

0
0

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

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

5995 学习 · 1909 问题

查看课程