首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Golang中实现适当的并行性?goroutines在1.5+版本中是并行的吗?

如何在Golang中实现适当的并行性?goroutines在1.5+版本中是并行的吗?
EN

Stack Overflow用户
提问于 2018-03-05 05:09:53
回答 1查看 5.7K关注 0票数 10

我知道并行和并发之间的区别。我正在寻找如何在Go中实现并行性。我原以为goroutines是并行的,但我找到的文档似乎并非如此。

设置GOMAXPROCS允许我们配置应用程序可以用于并行运行的线程数。从1.5版开始,GOMAXPROCS将内核数量作为值。据我所知,从1.5版开始,goroutines就一直是并行的。这个结论正确吗?

我在像StackOverflow这样的网站上发现的每个问题似乎都过时了,并且没有考虑到1.5版中的这一变化。请参阅:Parallel processing in golang

我的困惑源于试图在实践中测试这种并行性。我在Go 1.10中尝试了下面的代码,但它不能并行运行。

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {

    wg.Add(2)
    go count()
    go count()
    wg.Wait()

}

func count() {
    defer wg.Done()
    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }
}

将GOMAXPROCS设置为2不会更改结果。我得到的是并发程序,而不是并行程序。

我在一个8核系统上运行我所有的测试。

编辑:供以后参考。

我被这个博客迷住了:https://www.ardanlabs.com/blog/2014/01/concurrency-goroutines-and-gomaxprocs.html,在这个博客中,并行是在一个小的for循环中实现的,没有太多麻烦。@peterSO的答案是完全有效的。由于某些原因,在Go 1.10中,我无法复制博客的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-05 05:47:55

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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49100512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档