【问题标题】:What is the GOMAXPROCS default value?GOMAXPROCS 默认值是多少?
【发布时间】:2013-07-25 09:16:44
【问题描述】:

不设置同名环境变量时,是否保证GOMAXPROCS设置为1?

此代码显示值:

package main

import (
    "runtime"
    "fmt"
)

func getGOMAXPROCS() int {
    return runtime.GOMAXPROCS(0)
}

func main() {
    fmt.Printf("GOMAXPROCS is %d\n", getGOMAXPROCS())
}

并像这样运行它:

$ GOMAXPROCS= go run max.go 
GOMAXPROCS is 1

在这种情况下显示它是 1,但我在这里寻找一些确认。

【问题讨论】:

    标签: runtime go


    【解决方案1】:

    2018 年更新: 默认情况下,Go 程序运行时将 GOMAXPROCS 设置为可用内核数;在以前的版本中,它默认为 1。

    从 Go 1.5 开始,默认值为核心数。 如果您在较新的 Go 版本中对此不满意,您只需要显式设置它。


    不,不能保证默认值是什么;即使所有已知的实现都使用值“1”。如果您的代码在没有环境变量的情况下需要特定的默认值,那么您应该在代码中设置它。 Additionally:

    GOMAXPROCS 设置可以同时执行的最大 CPU 数量并返回之前的设置。如果 n 调度程序改进后,此调用将消失。

    (强调我的)

    【讨论】:

    • GOMAXPROCS 最早要等到 Go 2.0 才会消失,否则它将破坏 Go 1 的保证:除非是错误修复,否则不会进行任何破坏构建或更改标准库行为的 API 更改.由于 GOMAXPROCS 有点奇怪并且直接影响运行时,它可能会成为建议而不是命令,但它不会在 Go 1.2 或其他任何版本中突然消失。
    • @Jsor 如果 GOMAXPROCS 要改变某些东西的行为,对我来说这听起来像是一个错误?
    • @inf 这不会是一个错误,因为它不会影响语言的语义(即最终结果)。唯一会影响语义的情况是,如果您开始使用未定义/非法行为,例如竞争条件。想想像 C++ 中的 inline 指令这样的 GOMAXPROCS,编译器可以忽略它,因为有时它比你更清楚,但它也不会影响最终结果,除非你在做非常奇怪的事情。 GOMAXPROCS 是一个运行时指令,但同样适用(尽管需要考虑 OpenGL 之类的东西)。
    • @Jsor 好吧,那是个误会。我以为您的意思是更改默认值会破坏稳定性保证,并且您的想法与您刚才描述的相同。
    • 这个答案在 Go 1.5 中已经过时了。当前正确答案见 laike9m 的回答。
    【解决方案2】:

    正如Go 1.5 Release Notes 所说

    默认情况下,Go 程序运行时将 GOMAXPROCS 设置为可用内核数;在以前的版本中,它默认为 1。

    所以从 Go 1.5 开始,默认值应该是核心数。

    【讨论】:

    • 如果 GOMAXPROCS > 核心数会发生什么
    • 您最终可能会遇到更高的 CPU 负载(任务争夺 CPU 时间)。
    【解决方案3】:

    从 Go 1.5 开始,GOMAXPROCS 默认设置为可用的 CPU 数量。但是,您可以使用 GOMAXPROCS 环境变量或调用 runtime.GOMAXPROCS 显式设置它。

    https://docs.google.com/document/d/1At2Ls5_fhJQ59kDK2DFVhFu3g5mATSXqqV5QrxinasI/preview?sle=true

    【讨论】:

    • 请注意,这(目前)只是一个提议,即使被接受,如果出现不可预见的问题,默认设置也可能恢复为 1..
    猜你喜欢
    • 2014-10-20
    • 2018-07-12
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2021-11-16
    相关资源
    最近更新 更多