为什么这段关于 golang goruntine 运行 order 的代码是 "2" first

why this code about golang goruntine running order is "2" first

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”。

我想查一下information.But我不知道应该找什么资料check.So我post问题那里求助

我认为第一个goroutine是队列中的第一个push。应该先打印。

您没有将 2 个已启动的 goroutines 彼此同步,因此无法保证它们 运行 的顺序。您唯一同步的是主 goroutine 等待其他 2 个完成,但它们的顺序将是未定义的。

这是一个使用另一个同步订单的示例 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.

上试试这个