关于go的sync.WaitGroup里的goroutine的执行顺序的疑惑,请大神指点,谢谢!
简要代码如下:
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func main() {
wg.Add(2)
go fun1()
go fun2()
fmt.Println("main进入阻塞状态,等待wg中的子goroutine结束。")
wg.Wait()
fmt.Println("main 解除阻塞")
}
func fun1() {
for i := 1; i <= 20; i++ {
fmt.Println("fun1 i:", i)
}
wg.Done()
}
func fun2() {
//defer wg.Done()
for j := 1; j <= 20; j++ {
fmt.Println("\tfun2 j:", j)
}
wg.Done()
}
本人是 go 新手,这是在按网上的教程写的测试示例,我有点疑惑的是这段代码执行后为什么一直是先输出 fun2 方法里的内容,偶尔也会加载着 fun1 方法里的内容,这个大致能理解,但是不解的是为什么不会先输出 fun1 方法里的内容呢?
因为
go fun1()
这里的go
就是让fun1()
并发执行的,既然是并发执行,那就是这样的就比如你有两块A和B地要耕,你先叫了张三去耕A,一分钟后叫李四去耕B,那哪个最先到地里面(开始),哪个最先耕完(结束),都是未知的
本来就是乱序吧~
并发就是无序的,这才正常,先fun1再fun2不又成阻塞了嘛
协程,并发执行的呀
没遇到先输出 func1 的原因是你 run 的次数太少, 还有个概率(运气)问题, 代码没毛病, go runtime 执行
这个跟 GMP 模型有关了,可以看看这个 Goroutine 是怎么被分配到 P 上执行的。应该会有点帮助。