对不起,如果听起来很愚蠢。
如果在runtime.GOMAXPROCS(4)
时运行runtime.NumCpu() == 2
答案 0 :(得分:3)
runtime.GOMAXPROCS
控制将创建多少个操作系统级别的线程来运行程序的goroutine(以及为其运行的运行时)。 (运行时本身会为其自身创建更多线程,但这不重要。)
基本上,这就是所有发生的事情。
但是,据推测,您实际上打算问诸如“这将如何影响我的程序性能?”这样的问题,对吗? 如果是,答案是“取决于”。 我不确定您是否有机会使用只有一个CPU和一个单核的系统(基本上是大多数消费级IBM PC兼容计算机,直到Pentium®CPU的一代都具有“超线程”技术),但那些系统通常在“单核”上运行数百至数千个OS线程(该术语实际上在主流中并不存在,但是可以)。
要考虑的另一件事是您的程序不是孤立运行的:其他程序在同一CPU上运行,并且内核本身也有多个内核线程。
您可以使用top
或htop
之类的工具来评估系统当前正在所有核心上调度的线程数。
这一次,您可能想知道为什么Go运行时默认会创建与物理核一样多的线程来为goroutine提供动力。
大概是由于一个简单的事实,在典型的服务器端工作负载中,您的程序将成为“主要程序”。 换句话说,其线程与线程的争用 其他进程的数量,内核将相当低。