【发布时间】:2016-03-18 19:20:49
【问题描述】:
我有兴趣在 Go 中并行计算相关性。我遇到的主要问题是所有 Go 进程似乎都执行完全相同的计算。我在这里用一个非常简单的例子重现了这个问题。 我得到:
4 + 50 = 54
4 + 50 = 54
4 + 50 = 54
而不是:
1 + 20 = 21
2 + 30 = 32
3 + 40 = 43
如果我向上移动“wg.Wait()”,我会得到很好的结果,但没有并行性:( 提前感谢您的 cmets!
package main
import (
"fmt"
"runtime"
"sync"
)
func process_array(x, y int) int {
r := x + y
return r
}
func main() {
a1 := []int{0, 1, 2, 3, 4}
a2 := []int{10, 20, 30, 40, 50}
runtime.GOMAXPROCS(8)
var wg sync.WaitGroup
for i := 1; i < 4 ; i++ {
wg.Add(1)
go func() {
defer wg.Done()
x :=process_array(a1[i],a2[i])
fmt.Println(a1[i],"+", a2[i],"=", x)
}()
//wg.Wait() give the good result
//but it is not parallel processing
// 1 + 20 = 21
// 2 + 30 = 32
// 3 + 40 = 43
}
wg.Wait() // give a repetition of the same result :
// 4 + 50 = 54
// 4 + 50 = 54
// 4 + 50 = 54
}
【问题讨论】:
-
请注意,实际上,你想给你的 goroutines 更大的任务(例如,如果你有 N 个 cpus,给每个 1/n 做)。一个添加非常快,启动线程等的协调需要登录器。
标签: arrays go parallel-processing