如果我每个for循环放一个channel,那么他们是无序打印的,如果我一个for循环放2个,他们就是有序打印的,这是什么原理

来源:11-1 channel

慕仙908892

2020-08-21

如果我每个for循环放一个channel,那么他们是无序打印的,如果我一个for循环放2个,他们就是有序打印的,这是什么原理
func chanDemo() {
var channels [10]chan int
for i := 0; i < 10; i++ {
channels[i] = make(chan int)
go worker(i, channels[i])
//channels[i] <- 1
//channels[i] <- 2

}

for i :=0; i< 10; i++ {
	channels[i] <- 'a' + 1
	//channels[i] <- 'A' + 2
}
for i :=0; i< 10; i++ {
	channels[i] <- 'a' + 1
	//channels[i] <- 'A' + 1
}
//fmt.Println(n)
time.Sleep(time.Millisecond)

}

无序的打印
Worker 2 received b
Worker 0 received b
Worker 1 received b
Worker 5 received b
Worker 1 received b
Worker 9 received b
Worker 2 received b
Worker 0 received b
Worker 3 received b
Worker 3 received b
Worker 8 received b
Worker 6 received b
Worker 7 received b
Worker 4 received b
Worker 4 received b
Worker 7 received b
Worker 6 received b
Worker 5 received b
Worker 9 received b
Worker 8 received b

如果放2个

func chanDemo()  {
	var channels [10]chan int
	for i := 0; i < 10; i++ {
		channels[i] = make(chan int)
		go worker(i, channels[i])
		//channels[i] <- 1
		//channels[i] <- 2
	}

	for i :=0; i< 10; i++ {
		channels[i] <- 'a' + 1
		channels[i] <- 'A' + 2
	}
	for i :=0; i< 10; i++ {
		channels[i] <- 'a' + 1
		channels[i] <- 'A' + 1
	}
	//fmt.Println(n)
	time.Sleep(time.Millisecond)
}

Worker 0 received b
Worker 0 received C
Worker 1 received b
Worker 1 received C
Worker 2 received b
Worker 2 received C
Worker 3 received b
Worker 3 received C
Worker 4 received b
Worker 4 received C
Worker 5 received b
Worker 5 received C
Worker 6 received b
Worker 6 received C
Worker 7 received b
Worker 7 received C
Worker 8 received b
Worker 8 received C
Worker 9 received b
Worker 9 received C
Worker 0 received b
Worker 0 received B
Worker 1 received b
Worker 1 received B
Worker 2 received b
Worker 2 received B
Worker 3 received b
Worker 3 received B
Worker 4 received b
Worker 4 received B
Worker 5 received b
Worker 5 received B
Worker 6 received b
Worker 6 received B
Worker 7 received b
Worker 7 received B
Worker 8 received b
Worker 8 received B
Worker 9 received b
Worker 9 received B

写回答

2回答

慕粉329807310

2020-10-08

我也观察到了,可能跟调度的算法有关,但是并不保证他每次或者以后永远都会这样,最好不要指望他有序

0
0

ccmouse

2020-08-25

这个并没有什么特别的道理。go语言并没有说它们会被有序打印。这里虽然有序了可能换机器或者换版本又会变得无序

0
0

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

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

5995 学习 · 1909 问题

查看课程