如何在Golang中实现正确的并行性? goroutines是否与Go1.5 +并行?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Golang中实现正确的并行性? goroutines是否与Go1.5 +并行?相关的知识,希望对你有一定的参考价值。
我当然想学习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评论,该主题提供了有关主题的最新信息(截至03/18),指出goroutines自Go开始以来完全平行,唯一的区别是1.5是GOMAXPROCS设置。
答案
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
以上是关于如何在Golang中实现正确的并行性? goroutines是否与Go1.5 +并行?的主要内容,如果未能解决你的问题,请参考以下文章