如何在Golang中实现正确的并行性? goroutines是否与Go1.5 +并行?

时间:2018-03-04 21:09:53

标签: go concurrency parallel-processing

我当然想学习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设置。

1 个答案:

答案 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