Golang协程调度,为什么这两个代码片段的结果一个有序一个无序?
问题一:为什么这两个代码片段的结果一个有序一个无序?
问题二:我查网上资料写着Go 协程调度不是随机的,但它也不是按顺序的。它是一种抢占式、工作窃取的调度模型,我没理解这和随机的有啥区别
代码片段一:输出的结果有序
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan struct{})
for i := 0; i < 10; i++ {
go func(num int) {
for {
<-ch
fmt.Println(num)
}
}(i)
time.Sleep(time.Millisecond)
}
time.Sleep(time.Second)
for j := 0; j < 10; j++ {
ch <- struct{}{}
time.Sleep(time.Millisecond)
}
time.Sleep(time.Minute)
}
代码片段二:输出的结果无序
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan struct{})
for i := 0; i < 10; i++ {
go func(num int) {
for {
<-ch
fmt.Println(num)
}
}(i)
time.Sleep(time.Millisecond)
}
time.Sleep(time.Second)
for j := 0; j < 10; j++ {
ch <- struct{}{}
}
time.Sleep(time.Minute)
}
因为第一个你睡的时间太长了。 可以这么理解,买煎饼的的人,每买一个就刷一个视频,刷完再买第二个。 因为做煎饼的在你刷视频期间就做完了,所以完全和你买煎饼的顺序一样。
第二个乱序,是因为,你连续买煎饼,买了一个,又下单一个,连续下了10单,再看视频,10个做煎饼的师傅,做的速度追不上你下单的速度,但是每个做煎饼的师傅做的速度可能有细小差别,就导致,做完煎饼的时间有先有后。