可以不连接所有可用的 CPU 电源吗?

Possibility to NOT hook all available CPU power?

我知道,大多数 go 初学者都会问如何执行 go-routines / concurrency,这一点我几周前就通过了。 :-)

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

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

虽然我的转码器正在工作,但整个系统都滞后了。我必须将 go 任务的优先级更改为低或空闲才能再次工作。

我怎样才能实现保持系统响应的东西?

现在我启动了数千个 go-routines(循环指针片段)。我应该限制例程的数量吗?

降低进程优先级可以说是正确的方法。使用 OS 的调度程序。这就是它的用途。 Per this question 您可以像这样以指定的优先级启动您的进程:

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

可能还可以从应用程序中设置进程优先级:

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

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

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

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

for {
    sem <- 1
    go doThis()
}

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

for 循环中的 "sem <- 1" 阻塞,直到通过 doThis 从 sem 通道中提取一些东西释放 goroutine "slot" /