并行处理数组:对许多线程的任何风险



我有一个关于我之前的文章 在 Go 并行中处理数组:想象一下我的数组非常大,例如

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() 

换句话说,运行时。GOMAXPROCS(4) 能够将线程数限制为 4 个,或者,会出现 1000 个线程的"累积"问题?感谢您的评论!

在编写并行代码以提高速度时,请始终记住阿姆达尔定律。他的定律给出了一个非常有用的经验法则,说明何时停止打扰,可以解释为"顺序位将成为瓶颈"。

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

通常,您使用的方法是数据并行的:跨多个进程对数据结构的独立段进行"几何"分解。

您还可以考虑函数分解(本质上是管道),其中不同的阶段执行不同的工作。

然后是特殊的时间情况,使用主工作线程或"数据耕作"作为实现并行性的一种方式。

所有这些都需要真正的并行硬件才能真正有用。使用这些技术的多处理的一个很好但很古老的总结是Tidmus/Chalmers Practical Parallel Processing: An Introduction to Problems Solution in Parallel (ISBN 1850321353)。

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

GOMAXPROCS 设置可执行的最大 CPU 数量 同时并返回以前的设置。如果 n <1,则不 更改当前设置。本地逻辑 CPU 的数量 机器可以使用 NumCPU 查询。此呼叫将在以下情况下消失 调度程序改进。

戈马克斯处理器

并在同一页面上:

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

最新更新