关于我之前的帖子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个主题?感谢您的评论!
答案 0 :(得分:0)
你的for循环将创建1000个goroutines,runtime.GOMAXPROCS(4)
on设置可以使用的cpus数。
GOMAXPROCS设置可以执行的最大CPU数 同时返回先前的设置。如果n < 1,它没有 更改当前设置。本地逻辑CPU的数量 可以使用NumCPU查询机器。这个电话将会消失 调度程序改进。
并在同一页面上:
GOMAXPROCS变量限制操作系统线程的数量 可以同时执行用户级Go代码。没有限制 代表系统调用中可以阻止的线程数 Go代码;那些不计入GOMAXPROCS限制。这个 package的GOMAXPROCS函数查询并更改限制。
答案 1 :(得分:0)
编写并行代码以提高速度时,请始终记住Amdahl's Law。他的定律给出了一个关于何时停止打扰的非常有用的经验法则,并且可以被解释为“顺序位将成为瓶颈”。
如果你忽略了阿姆达尔定律,你最终可能会浪费时间追逐不可能实现的目标。相反,您可能需要考虑更广泛的并发问题,以便在多个地方或以多种方式解决任何性能问题。
通常,您使用的方法是数据并行的:&#34;几何&#34;跨多个流程分解独立的数据结构段。
您可能还会考虑功能分解(基本上是管道),其中不同的阶段执行不同的工作。
然后有一个特殊的时间案例,使用master-worker或&#39;数据耕作&#39;作为实现并行性的一种方式。
所有这些往往需要真正的并行硬件才能真正有用。 Tidmus / Chalmers 实用并行处理:并行解决问题的介绍(ISBN 1850321353),这是一个很好但又陈旧的使用这些技术的多处理总结。