抱歉,这听起来很愚蠢。

如果在运行runtime.GOMAXPROCS(4)的同时运行runtime.NumCpu() == 2会发生什么

最佳答案

runtime.GOMAXPROCS控制将创建多少个操作系统级别的线程来运行程序的goroutine(以及为其提供动力的运行时)。 (运行时本身将为其自身创建更多线程,但这是不重要的。)

基本上,这就是所有将会发生的事情。

但是据推测,您实际上打算问诸如“这将如何影响程序性能?”这样的问题,对吗?
如果是,答案是“取决于”。
我不确定您是否有机会使用只有一个CPU和一个单核的系统(基本上是大多数消费级IBM PC兼容计算机,直到Pentium®CPU一代为止,所谓的“超线程”技术),但这些系统通常在“单核”上运行数百至数千个OS线程(该术语实际上并不存在于主流中,但可以)。

要考虑的另一件事是您的程序不是孤立运行的:同一程序上还有其他程序在运行,并且内核本身也有多个内核线程。
您可以使用tophtop之类的工具来评估系统当前正在所有内核上调度的线程数。

到这个时候,您可能想知道为什么Go运行时默认创建与goroutine一样多的线程来为goroutine提供动力。

据推测,这来自一个简单的事实,在典型的服务器端工作负载中,您的程序将成为“主要程序”。
换句话说,其线程与线程的争用
其他进程的数量和内核将相当低。

10-05 23:07
查看更多