GOMAXPROCS设置可以同时执行的CPU的最大数量,并返回之前的设置。它的默认值为runtime.NumCPU。
NumCPU返回当前进程可用的逻辑CPU数。
下面的代码不会更改进程使用的逻辑CPU数量:
package main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(1)
fmt.Println(runtime.NumCPU()) // Expected: 1 Actual: 8
}
在我的笔记本电脑里:
$ lscpu # shows eight virtual cores corresponding to eight OS threads
...
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
$ go version
go version go1.20.2 linux/amd64
如何修改程序使用的逻辑CPU?
2条答案
按热度按时间zzoitvuj1#
如果你阅读了关于runtime.GOMAXPROCS和runtime.NumCPU()的文档,你会看到:
func NumCPU [...]
可用CPU集通过在进程启动时查询操作系统进行检查。进程启动后操作系统CPU分配的更改不会反映出来。
“进程启动后对操作系统CPU分配的更改不会反映出来”,这就是为什么您看不到此值更改的原因。
现在让我们看看GOMAXPROCS的文档
func GOMAXPROCS [...]
GOMAXPROCS设置可以同时执行的CPU的最大数量,返回之前的设置,默认为runtime.NumCPU.如果n〈1,则不改变当前的设置,当调度器改进时,此调用将消失。
因此,您可以通过运行以下命令来检查当前设置的值:
brccelvz2#
没有矛盾。
GOMAXPROCS影响Go运行时将使用的进程/线程的数量。它们将在哪些CPU核心上执行将根据系统上的其他负载而变化。
NumCPU返回可用内核的数量。即使Go运行时配置为不利用所有内核,它也不会改变。
NumCPU将反映通过操作系统机制设置的限制,例如