使用 GOMAXPROCS 在 Go 中进行并行编程

我看到有人设置runtime.GOMAXPROCS,以runtime.NumCPU()使并行中去处理。官方文档没有说明GOMAXPROCS;的上限。我可以将其设置为任意正整数,还是应该始终小于 eq. 以 NumCPU价值?

我试着将它设置为一个数字,比更大#逻辑核心,我的代码工作得很好


胡子哥哥
浏览 259回答 2
2回答

MM们

GOMAXPROCS由于运行时会为您与操作系统进行交互,因此您不需要在大多数时候搞砸。 GOMAXPROCS过去默认为 1,但在 Go 1.5 中,现在默认为NumCPU()将其设置为高于 NumCPU 只会为调度程序提供更多(不必要的)处理操作系统线程的工作。

慕勒3428872

最大值为 256;但请注意,如果您将其设置得更高,则不会出错。https://golang.org/src/runtime/debug.go?s=534:560#L712&nbsp; // GOMAXPROCS sets the maximum number of CPUs that can be executing13&nbsp; // simultaneously and returns the previous setting.&nbsp; If n < 1, it does not14&nbsp; // change the current setting.15&nbsp; // The number of logical CPUs on the local machine can be queried with NumCPU.16&nbsp; // This call will go away when the scheduler improves.17&nbsp; func GOMAXPROCS(n int) int {18&nbsp; &nbsp; &nbsp; if n > _MaxGomaxprocs {19&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n = _MaxGomaxprocs20&nbsp; &nbsp; &nbsp; }21&nbsp; &nbsp; &nbsp; lock(&sched.lock)22&nbsp; &nbsp; &nbsp; ret := int(gomaxprocs)23&nbsp; &nbsp; &nbsp; unlock(&sched.lock)24&nbsp; &nbsp; &nbsp; if n <= 0 || n == ret {25&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return ret26&nbsp; &nbsp; &nbsp; }27&nbsp;&nbsp;28&nbsp; &nbsp; &nbsp; stopTheWorld("GOMAXPROCS")29&nbsp;&nbsp;30&nbsp; &nbsp; &nbsp; // newprocs will be processed by startTheWorld31&nbsp; &nbsp; &nbsp; newprocs = int32(n)32&nbsp;&nbsp;33&nbsp; &nbsp; &nbsp; startTheWorld()34&nbsp; &nbsp; &nbsp; return ret35&nbsp; }Line 19将总数设置为_MaxGomaxprocs。这是...https://golang.org/src/runtime/runtime2.go?h=_MaxGomaxprocs#L407const (&nbsp; &nbsp; // The max value of GOMAXPROCS.&nbsp; &nbsp; // There are no fundamental restrictions on the value.&nbsp; &nbsp; _MaxGomaxprocs = 1 << 8)二进制形式的位移是100000000和 1 是int在 64 位系统上,Go 使其成为 Int64,这意味着最大值是 256。(intGo 中的32 位系统将是 int32,但值为 256)现在,只要将其设置为多于您的内核数量 - 这一切都取决于您的工作负载和正在发生的 CPU 上下文切换(例如,您的 go 程序强制发生多少锁,或者您是否mutex.Lock()在任何地方使用等)。请记住,无论是否需要,Golang 都会抽象出上下文切换。基准测试是您的朋友。如果您的应用程序运行 10,000 个 goroutine,而几乎没有 cpu 上下文切换(遵循良好的设计模式),那么是的,将那个吸盘提升到 256 并让它运行。如果您的应用程序阻塞并通过上下文切换/线程创建大量 CPU 等待时间,则将其设置为 8 或 4,甚至可以在所有mutex锁定进行时为其提供喘息的空间。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go