为什么这段关于 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.
上试试这个
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.
上试试这个