在 Go 中并行处理数组:有太多线程的风险吗?

我有一个关于我之前在 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,或者,会出现“累积”1000 个线程的问题?感谢您的意见 !


慕尼黑8549860
浏览 186回答 2
2回答

叮当猫咪

在编写并行代码以提高速度时,请始终记住Amdahl 定律。他的定律给出了关于何时停止打扰的非常有用的经验法则,可以解释为“顺序位将成为瓶颈”。如果你忽视阿姆达尔定律,你最终可能会浪费时间去追逐不可能的目标。相反,您可能需要考虑更广泛的并发问题,以在多个地方或以多种方式解决任何性能问题。通常,您使用的方法是数据并行:跨多个进程的数据结构独立段的“几何”分解。您还可以考虑功能分解(本质上是管道),其中不同阶段执行不同的工作。然后是特殊的时间情况,使用 master-worker 或“数据农业”作为实现并行性的一种方式。所有这些往往需要真正的并行硬件才能真正有用。Tidmus/Chalmers实用并行处理:并行解决问题简介(ISBN 1850321353) 中对使用这些技术的多处理进行了很好但很陈旧的总结。

手掌心

您的 for 循环将创建 1000 个 goroutine,runtime.GOMAXPROCS(4)设置可以使用的 CPU 数量。GOMAXPROCS 设置可以同时执行的最大 CPU 数量并返回之前的设置。如果 n < 1,则不会更改当前设置。可以用NumCPU查询本地机器上逻辑CPU的数量。当调度程序改进时,此调用将消失。GOMAXPROCS并在同一页面上:GOMAXPROCS 变量限制了可以同时执行用户级 Go 代码的操作系统线程的数量。代表Go代码在系统调用中可以阻塞的线程数没有限制;这些不计入 GOMAXPROCS 限制。这个包的 GOMAXPROCS 函数查询和更改限制。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go