Windows 不挂接所有可用CPU电源的可能性?

Windows 不挂接所有可用CPU电源的可能性?,windows,go,concurrency,goroutine,Windows,Go,Concurrency,Goroutine,我知道,大多数围棋初学者都会问如何进行表演性围棋套路/并发性,这一点我几周前就通过了。:-) 我有一个真正的快速转换编码器,使用我的4+4(i7ht)CPU的每个可用周期。它将一个文件读入指向结构的指针片段,对这些指针进行计算,并将结果写回磁盘。我用的是bufio。我来自VB,所以围棋的表现令人难以置信 我试图添加最少的睡眠(通过time.Sleep()),但这大大降低了性能 当我的trans-coder工作时,整个系统都落后了。我必须将go任务的优先级更改为low或idle才能再次工作 如何实

我知道,大多数围棋初学者都会问如何进行表演性围棋套路/并发性,这一点我几周前就通过了。:-)

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

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

当我的trans-coder工作时,整个系统都落后了。我必须将go任务的优先级更改为low或idle才能再次工作

如何实现使系统保持响应的功能


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

降低进程优先级可以说是正确的方法。使用操作系统的调度程序。这就是它的目的。您可以使用指定的优先级启动流程,如下所示:

start "MyApp" /low "C:\myapp.exe"
您还可以从应用程序中设置进程优先级:


最后,您可以使用
GOMAXPROCS
配置进程允许使用的CPU数量。您可以在运行时将其作为环境变量传入,也可以在代码中调用以覆盖它

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

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

for {
    sem <- 1
    go doThis()
}

func doThis() {
    //do this
    <- sem
}
sem:=make(chan int,10)//限制在go例程中
为了{

所以我应该把翻译的部分外包给其他人,然后从main开始使用某种具有特定优先级的加载程序?比如gui+jobs+solver?这完全取决于你的需要。做任何适合你的事情。如果以较低优先级运行整件事情都有效,我看不出有任何理由让它变得更复杂。我只是希望跳过通过任务管理器手动降低优先级的操作,使其尽可能对用户友好。最简单但最难看的解决方案可能是使用clickme.cmd,以低于正常值的优先级启动exe…但这并不明智。更新了更多选项。可运行的Goroutine不会比内核多得多,所以是的:限制它们。减少GOMAXPROCS以限制程序将使用的线程数和内核数。
sem := make(chan int, 10) // limited at go routines 

for {
    sem <- 1
    go doThis()
}

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