是否不挂接所有可用的CPU电源?

时间:2018-10-24 13:58:15

标签: windows go concurrency goroutine

我知道,go的大多数初学者都问如何拥有高效的go例程/并发性,这是我几周前通过的。 :-)

我有一个真正的快速代码转换器,它使用4 + 4(i7 HT)CPU的每个可用周期。它将文件读入指向结构的指针的切片中,对这些结构进行计算,然后将结果写回磁盘。我正在使用bufio。我来自VB,因此Go的表现令人难以置信。

我尝试添加最少的睡眠(通过time.Sleep()),但这会大大降低性能。

我的代码转换器工作正常时,整个系统仍然落后。我必须将go任务的优先级更改为“低”或“空闲”,才能再次工作。

我该如何实施使系统保持响应速度的内容?

现在,我开始执行数千个go例程(遍历指针的一部分)。我应该限制例程的数量吗?

2 个答案:

答案 0 :(得分:3)

降低进程优先级可以说是正确的方法。使用操作系统的调度程序。那就是它的目的。 Per this question,您可以按照指定的优先级开始流程,如下所示:

start "MyApp" /low "C:\myapp.exe"

也许还可以在应用程序per this question中设置进程优先级:

err := syscall.Setpriority(syscall.Getpid(), -1, -1)

最后,您可以使用GOMAXPROCS来配置允许该进程使用多少CPU。您可以在运行时将其作为环境变量传入,或在代码中调用runtime.GOMAXPROCS()来覆盖它。

答案 1 :(得分:-1)

可能最简单的解决方案是使用信号量限制并发goroutine的数量,例如:

sem := make(chan int, 10) // limited at go routines 

for {
    sem <- 1
    go doThis()
}

func doThis() {
    //do this
    <- sem
}

for循环中的“ sem <-1”会阻塞,直到通过doThis释放goroutine的“ slot”为止。这将从sem通道中提取一些内容/