【发布时间】:2012-10-25 10:40:28
【问题描述】:
我是 Google Go (Golang) 的新手。我的问题与What exactly does runtime.Gosched do? 这个帖子有关。代码结构复制如下。我的问题是,当我更改 GOMAXPROCS 中的处理器数量时,我如何验证它正在运行多少个处理器。当我执行 'top' 时,它会显示一个消耗 100% 或更少资源的进程,即使 GOMAXPROCS 大于 1。我会感谢您的帮助。
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func doTasks() {
fmt.Println(" Doing task ")
for ji := 1; ji < 100000000; ji++ {
for io := 1; io < 10; io++ {
//Some computations
}
}
runtime.Gosched()
wg.Done()
}
func main() {
wg.Add(1)
runtime.GOMAXPROCS(1) // or 2 or 4
go doTasks()
doTasks()
wg.Wait()
}
【问题讨论】:
-
你在什么操作系统上测试这个?了解您使用的 CPU 也会有所帮助。我无法重现该行为。
-
cat /etc/*-release 返回:Red Hat Enterprise Linux Workstation 版本 6.3(圣地亚哥)。操作系统是linux。 CPU 是 Intel(R) Xeon(R) CPU,X5460 @ 3.16GHz。 NumCPU 返回 8。
-
看来你的大括号没有配对(func doTasks())。这很重要,因为调用 runtime.Gosched() 的位置很重要......
-
请尝试合理地格式化您的代码。您可以将其粘贴到 play.golang.org 并单击
format,它会为您执行此操作。您会注意到它会失败,因为您的代码无效。当您的代码有效时,更容易为您提供帮助。 -
我不确定
top(这些天我很少碰它)但htop默认显示所有运行在每个过程的上下文。当然,这不是 正在运行 线程的数量,但至少它可以让您了解 Go 运行时是否决定为您的程序创建另一个线程。跨度>