我当然想学习Golang。我知道并行性和并发性之间的区别。我基本上寻找如何做伟大的并行性。我期待goroutines允许我以某种方式做到这一点。但是,看起来好像1.5 GOMAXPROCS设置为核心数。这是否意味着因为1.5 goroutines基本上是平行的!?
我在StackOverflow等网站上研究的每个问题都已过时,并未考虑1.5的变化。请参阅:Parallel processing in golang
运行以下代码无法实现Go 1.10中的并行性:https://play.golang.org/p/24XCgOf0jy5
将GOMAXPROCS设置为2不会改变输出,纯粹是并发而不是并行。
编辑:我在FX-6300上运行它。
编辑2 :尽管这个问题得到了充分的回答,但我认为(但并不完美)却是正确的,我会假设它缺乏基于downvotes的上下文。
如果有人遇到这个问题,以备将来参考:
我被这个博客带走了:https://www.ardanlabs.com/blog/2014/01/concurrency-goroutines-and-gomaxprocs.html在一个小的for循环中完全完成了并行性而没有太多麻烦。我应该从一开始就引用它。
我还应该指出,我正在使用游乐场来共享代码,而不是实际在那里运行代码。
@peterSO的答案完全有效,无论出于何种原因,在Go 1.10中,与博客相同的行为无法完全复制。
如果您想了解更多信息,请查看主要问题的@kostix评论,该评论提供了有关goroutines完全并行的主题的更新信息(截至03/18)。 Go,与1.5的唯一区别是GOMAXPROCS设置。
答案 0 :(得分:4)
Go Playground是一款单处理器虚拟机。你正在经营一个琐碎的goroutine。玩具机上运行的玩具程序可以获得玩具效果。
在多CPU机器上运行:
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func count() {
defer wg.Done()
for i := 0; i < 10; i++ {
fmt.Println(i)
i := 0
for ; i < 1e6; i++ {
}
_ = i
}
}
func main() {
fmt.Println("Version", runtime.Version())
fmt.Println("NumCPU", runtime.NumCPU())
fmt.Println("GOMAXPROCS", runtime.GOMAXPROCS(0))
wg.Add(2)
go count()
go count()
wg.Wait()
}
输出:
Version go1.10
NumCPU 8
GOMAXPROCS 8
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9