package main
import (
"fmt"
"sync"
)
func main() {
runtime.GOMAXPROCS(1)
w := &sync.WaitGroup{}
w.Add(2)
go func() {
fmt.Println("1")
w.Done()
}()
go func() {
fmt.Println("2")
w.Done()
}()
w.Wait()
}
https://play.golang.org/p/ESi1mKAo1x_S
嗯,我不知道为什么先打印“ 2”。
我想检查信息。但是我不知道应该检查什么信息,所以我在此处张贴问题以寻求帮助。
我认为第一个goroutine是第一个推送队列。应该先打印。
答案 0 :(得分:6)
您没有将两个启动的goroutine相互同步 ,因此无法保证它们以什么顺序运行。您唯一要同步的就是等待其他2个完成的主要goroutine,但是它们的顺序是不确定的。
下面是一个示例,该示例还使用另一个sync.WaitGroup
来同步订单:
w := &sync.WaitGroup{}
w.Add(2)
w2 := &sync.WaitGroup{}
w2.Add(1)
go func() {
fmt.Println("1")
w.Done()
w2.Done()
}()
go func() {
w2.Wait()
fmt.Println("2")
w.Done()
}()
w.Wait()
输出将是(在Go Playground上尝试):
1
2
基本上,第二个goroutine等待w2
,一旦完成,它就会在第一个goroutine中被调用。
请注意,由于第二个goroutine等待第一个goroutine,所以只需要等待第二个goroutine就可以了(传递式地等待这两个)。所以上面的例子可以这样写:
w2 := &sync.WaitGroup{}
w2.Add(1)
go func() {
fmt.Println("1")
w2.Done()
}()
w := &sync.WaitGroup{}
w.Add(1)
go func() {
w2.Wait()
fmt.Println("2")
w.Done()
}()
w.Wait()
输出是相同的。在Go Playground上尝试这个。