我知道并行和并发之间的区别。我正在寻找如何在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中,我无法复制博客的结果。
发布于 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
https://stackoverflow.com/questions/49100512
复制相似问题