【发布时间】:2017-03-11 13:52:03
【问题描述】:
我正在实现我的第一个Golang 应用程序,但在使用MAX CPU & Cores 时遇到了一些问题,我真的不知道为什么。
使用htop 等工具时,CPU 不会以最大功率使用,只有1..4 threads 处于活动状态。此外,所有cores 都处于活动状态,但它们的利用率都在25%-40% 附近。
我用过:
func MaxParallelism() int {
maxProcs := runtime.GOMAXPROCS(0)
numCPU := runtime.NumCPU()
if maxProcs < numCPU {
return maxProcs
}
return numCPU
}
为了得到goroutines的个数被实例化。
这是我设置应用程序的方式:
//Common Channel for the goroutines
tasks := make(chan *exec.Cmd, 64)
//Spawning Max Cores Number goroutines (8)
var wg sync.WaitGroup
cores := MaxParallelism()
for i := 0; i < cores; i++ {
wg.Add(1)
go func(num int, w *sync.WaitGroup) {
defer w.Done()
var (
out []byte
err error
)
for cmd := range tasks {
out, err = cmd.Output()
if err != nil {
fmt.Printf("Can't get stdout:", err)
}
. . .
}
}(i, &wg)
}
//Generate Tasks
for i := 0; i < 100000; i++ {
tasks <- exec.Command(cmd1, args...)
tasks <- exec.Command(cmd2, args...)
}
close(tasks)
// wait for the workers to finish
wg.Wait()
我在执行应用程序时分享了@987654336@ 的两张截图
我不知道它是否有帮助,但我正在通过 Intellij Idea 启动它。
如何正确使用 Max CPU 和 Cores?
提前致谢。
【问题讨论】:
-
是什么让您认为它没有使用足够的 CPU 内核?你期望什么行为,你观察到什么行为?
-
我在执行应用程序时共享
htop的屏幕,以便您了解它。基本上,一次只有1 thread active,所有内核的使用率都在 25% 左右。 -
你说你正在生成 4 个 goroutine。你怎么知道你得到了 4 个?
-
这是一个错误,我使用 for 生成了 8 个并给它 Max Cores。
-
你的 goroutine 只是在生成其他进程。您的 Go 进程没有进行任何实际工作,那么为什么它会占用任何 CPU 时间?
标签: go concurrency goroutine