为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕尼黑8549860 2021-12-27 14:55:48
我有一个关于我之前在 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.WaitGroupIs 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 个线程的问题?感谢您的意见 !
查看完整描述

2 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

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

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

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

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

然后是特殊的时间情况,使用 master-worker 或“数据农业”作为实现并行性的一种方式。

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


查看完整回答
反对 回复 2021-12-27
?
手掌心

TA贡献1942条经验 获得超3个赞

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

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

GOMAXPROCS

并在同一页面上:

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


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信