我见过有人将runtime.GOMAXPROCS
设置为runtime.NumCPU()
以便在运行时启用并行处理。 Official documentation没有说GOMAXPROCS
的上限;我可以将其设置为任意正整数,还是应始终小于eq。到NumCPU
值?
我尝试将其设置为大于逻辑核心的#
的数字,我的代码工作正常
最佳答案
,最大为256 ;但是请注意,如果将其设置得更高,它不会出错。
https://golang.org/src/runtime/debug.go?s=534:560#L7
12 // GOMAXPROCS sets the maximum number of CPUs that can be executing
13 // simultaneously and returns the previous setting. If n < 1, it does not
14 // change the current setting.
15 // The number of logical CPUs on the local machine can be queried with NumCPU.
16 // This call will go away when the scheduler improves.
17 func GOMAXPROCS(n int) int {
18 if n > _MaxGomaxprocs {
19 n = _MaxGomaxprocs
20 }
21 lock(&sched.lock)
22 ret := int(gomaxprocs)
23 unlock(&sched.lock)
24 if n <= 0 || n == ret {
25 return ret
26 }
27
28 stopTheWorld("GOMAXPROCS")
29
30 // newprocs will be processed by startTheWorld
31 newprocs = int32(n)
32
33 startTheWorld()
34 return ret
35 }
Line 19
将总数设置为_MaxGomaxprocs
。那是...
https://golang.org/src/runtime/runtime2.go?h=_MaxGomaxprocs#L407
const (
// The max value of GOMAXPROCS.
// There are no fundamental restrictions on the value.
_MaxGomaxprocs = 1 << 8
)
二进制形式的位移是
100000000
,而1是一个int
,在64位系统上,Go使其成为Int64,这意味着的最大值为256 。 (Go中带有int
的32位系统为int32,但相同的值为256)现在,只要将其设置为比内核数更多的值,这全都取决于您的工作负载和正在发生的CPU上下文切换(例如,go程序强制执行多少次锁定,或者在各处使用
mutex.Lock()
等) 。记住,如果需要,Golang会抽象掉上下文切换。
基准测试是您的 friend 。如果您的应用程序运行10,000个goroutine,而几乎没有cpu上下文切换(遵循良好的设计模式),则可以将“sucker”提高到256并让它运行。如果您的应用程序因上下文切换/线程而阻塞并创建了大量CPU等待时间,则将其设置为8或4,甚至在
mutex
锁定继续进行的情况下为它腾出空间。关于go - 使用GOMAXPROCS进行并行编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36492356/