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

问题描述 投票:1回答:1

我当然想学习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 concurrency parallel-processing
1个回答
4
投票

Go Playground是一个单处理器虚拟机。你正在经营一个琐碎的goroutine。玩具机上运行的玩具程序可以获得玩具效果。

在多CP​​U机器上运行:

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
© www.soinside.com 2019 - 2024. All rights reserved.