我的 Go 程序如何让所有 CPU 内核都忙碌?

Goroutines 是轻量级进程,由 Go 运行时自动将时间切片到一个或多个操作系统线程上。(这是Go 的一个非常酷的功能!)

假设我有一个像网络服务器这样的并发应用程序。在我的假设程序中同时发生了很多事情,没有太多的非并发(阿姆达尔定律)比率。

似乎当前使用的操作系统线程的默认数量是 1。这是否意味着只有一个 CPU 内核被使用?

如果我开始我的程序

runtime.GOMAXPROCS(runtime.NumCPU())

这会合理有效地使用我 PC 上的所有内核吗?

使用更多操作系统线程是否有任何“并行松弛”好处,例如通过一些启发式

runtime.GOMAXPROCS(runtime.NumCPU() * 2)

?


翻过高山走不出你
浏览 218回答 3
3回答

慕容森

runtime.GOMAXPROCS()设置您的程序可以同时使用的(虚拟)CPU 内核数。允许 Go 使用比实际使用更多的 CPU 内核无济于事,因为您的系统只有这么多 CPU 内核。为了在多个线程中运行,您的程序必须有多个 goroutine,通常使用go someFunc(). 如果你的程序没有启动任何额外的 goroutines,无论你允许它使用多少 CPU/内核,它自然只会在一个线程中运行。查看这个和以下关于如何创建 goroutines 的练习。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go