因此,我在学习 Go 的同时试图了解并行计算的工作原理。我理解并发性和并行性之间的区别,但是,我有点坚持的是 Go(或操作系统)如何确定应该并行执行的东西......
编写代码时我必须做些什么,还是全部由调度程序处理?
在下面的示例中,我有两个使用 go 关键字在单独的 Go 例程中运行的函数。因为默认的 GOMAXPROCS 是您机器上可用的处理器数量(我也明确设置了它)我希望这两个函数同时运行,因此输出将是特定顺序的数字混合 - 并且此外,每次运行时输出都会不同。然而,这种情况并非如此。相反,它们一个接一个地运行,更令人困惑的是,功能二在功能一之前运行。
代码:
func main() {
runtime.GOMAXPROCS(6)
var wg sync.WaitGroup
wg.Add(2)
fmt.Println("Starting")
go func() {
defer wg.Done()
for smallNum := 0; smallNum < 20; smallNum++ {
fmt.Printf("%v ", smallNum)
}
}()
go func() {
defer wg.Done()
for bigNum := 100; bigNum > 80; bigNum-- {
fmt.Printf("%v ", bigNum)
}
}()
fmt.Println("Waiting to finish")
wg.Wait()
fmt.Println("\nFinished, Now terminating")
}
输出:
go run main.go
Starting
Waiting to finish
100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Finished, Now terminating
我正在关注这篇文章,尽管我遇到的几乎每个示例都做类似的事情。 并发、Goroutines 和 GOMAXPROCS
这是应该的工作方式,我没有正确理解某些东西,还是我的代码不正确?
qq_笑_17
婷婷同学_
相关分类