为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
胡子哥哥 2022-01-04 10:09:00
我看到有人设置runtime.GOMAXPROCS,以runtime.NumCPU()使并行中去处理。官方文档没有说明GOMAXPROCS;的上限。我可以将其设置为任意正整数,还是应该始终小于 eq. 以 NumCPU价值?我试着将它设置为一个数字,比更大#的逻辑核心,我的代码工作得很好
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

GOMAXPROCS由于运行时会为您与操作系统进行交互,因此您不需要在大多数时候搞砸。 GOMAXPROCS过去默认为 1,但在 Go 1.5 中,现在默认为NumCPU()

将其设置为高于 NumCPU 只会为调度程序提供更多(不必要的)处理操作系统线程的工作。


查看完整回答
反对 回复 2022-01-04
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

最大值为 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。(intGo 中的32 位系统将是 int32,但值为 256)


现在,只要将其设置为多于您的内核数量 - 这一切都取决于您的工作负载和正在发生的 CPU 上下文切换(例如,您的 go 程序强制发生多少锁,或者您是否mutex.Lock()在任何地方使用等)。


请记住,无论是否需要,Golang 都会抽象出上下文切换。


基准测试是您的朋友。如果您的应用程序运行 10,000 个 goroutine,而几乎没有 cpu 上下文切换(遵循良好的设计模式),那么是的,将那个吸盘提升到 256 并让它运行。如果您的应用程序阻塞并通过上下文切换/线程创建大量 CPU 等待时间,则将其设置为 8 或 4,甚至可以在所有mutex锁定进行时为其提供喘息的空间。


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信