关于 goroutine 调度问题

nfwater · · 933 次点击
``` package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(1) var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() fmt.Println("A") }() go func() { defer wg.Done() fmt.Println("B") }() wg.Wait() } ``` 这个例子也是一样,先输出 B,再输出 A,这是为什么?
#1
更多评论
``` package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(1) var wg sync.WaitGroup wg.Add(10) for index := 1; index <= 10; index++ { go func(i int) { wg.Done() fmt.Println(i) }(index) } wg.Wait() } ``` 再看这个例子,输出结果: 10 1 2 3 4 5 6 7 8 9 给人的感觉就是始终最先执行最后一个goroutine,再顺序执行前面的goroutine
#2
这个顺序跟内部的实现机制有关系,如果把两个函数的位置互换一下,可能又变化了,如果每次循环加上sleep时间,也就更不一样了。
#3