Go并行处理数组:多线程的风险?

时间:2016-03-19 16:13:12

标签: arrays go parallel-processing

关于我之前的帖子Processing array in Go parallel我还有一个问题:想象一下我的数组非常大,例如

a1 := []int{0, 1, 2, 3, 4...1000}
a2 := []int{10, 20, 30, 40, 50...10000}

and I have only 4 cpus :

runtime.GOMAXPROCS(4)
var wg sync.WaitGroup

Is the following code still correct ?

for i := 1; i < 1000; i++ {
    wg.Add(1)
    go func(i int) {
        defer wg.Done()
        x := process_array(a1[i], a2[i])
        fmt.Println(a1[i], "+", a2[i], "=", x)
    }(i)      
}
wg.Wait() 

换句话说,runtime.GOMAXPROCS(4)将能够将线程数限制为4,或者,会出现&#34; accum积累的问题。 1000个主题?感谢您的评论!

2 个答案:

答案 0 :(得分:0)

你的for循环将创建1000个goroutines,runtime.GOMAXPROCS(4) on设置可以使用的cpus数。

  

GOMAXPROCS设置可以执行的最大CPU数   同时返回先前的设置。如果n < 1,它没有   更改当前设置。本地逻辑CPU的数量   可以使用NumCPU查询机器。这个电话将会消失   调度程序改进。

GOMAXPROCS

并在同一页面上:

  

GOMAXPROCS变量限制操作系统线程的数量   可以同时执行用户级Go代码。没有限制   代表系统调用中可以阻止的线程数   Go代码;那些不计入GOMAXPROCS限制。这个   package的GOMAXPROCS函数查询并更改限制。

答案 1 :(得分:0)

编写并行代码以提高速度时,请始终记住Amdahl's Law。他的定律给出了一个关于何时停止打扰的非常有用的经验法则,并且可以被解释为“顺序位将成为瓶颈”。

如果你忽略了阿姆达尔定律,你最终可能会浪费时间追逐不可能实现的目标。相反,您可能需要考虑更广泛的并发问题,以便在多个地方或以多种方式解决任何性能问题。

通常,您使用的方法是数据并行的:&#34;几何&#34;跨多个流程分解独立的数据结构段。

您可能还会考虑功能分解(基本上是管道),其中不同的阶段执行不同的工作。

然后有一个特殊的时间案例,使用master-worker或&#39;数据耕作&#39;作为实现并行性的一种方式。

所有这些往往需要真正的并行硬件才能真正有用。 Tidmus / Chalmers 实用并行处理:并行解决问题的介绍(ISBN 1850321353),这是一个很好但又陈旧的使用这些技术的多处理总结。