Go运行时使用的线程数

Go运行时(调度程序,垃圾回收器等)可以使用多less个线程? 例如,如果GOMAXPROCS10 ,运行时会使用多less个内核线程?

编辑:

我正在阅读在Go 1.5 GOMAXPROCS更改为runtime.NumCPU() 。 有一句话声称,“由于运行时间的并行性,特别是垃圾收集器,通过提高GOMAXPROCS可以提高单个程序的性能。”

我真正的问题是:如果我有一个运行在具有CPU配额的Docker容器中的单个goroutine程序,那么为了获得最高的性能,我需要的逻辑处理器的最小数量是多less。

没有直接的相关性。 您的应用使用的线程可能less于,等于或多于10个。

runtime包文档引用:

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

所以如果你的应用程序没有启动任何新的例程,线程数将会less于10。

如果您的应用程序启动了很多没有阻塞的goroutines(> 10),那么10个操作系统线程将同时执行您的goroutine。

如果您的应用程序启动了许多系统调用中阻塞了很多(> 10)的goroutine,则会产生10个以上的OS线程(但最多只有10个执行用户级Go代码)。

看到这个问题的一个例子和细节: 为什么它不会创build许multithreading,当golang写入文件时,许多goroutines被阻止?

编辑(回应你的编辑):

我相信GOMAXPROCS的默认值是逻辑CPU的数量有一个原因:因为通常提供最高的性能。 你可以把它留在那。 一般情况下,如果你只有一个goroutine,而且你确定你的代码没有产生更多的代码, GOMAXPROCS=1就足够了,但是你应该testing一下,不要GOMAXPROCS=1