我知道,go的大多数初学者都问如何拥有高效的go例程/并发性,这是我几周前通过的。 :-)
我有一个真正的快速代码转换器,它使用4 + 4(i7 HT)CPU的每个可用周期。它将文件读入指向结构的指针的切片中,对这些结构进行计算,然后将结果写回磁盘。我正在使用bufio。我来自VB,因此Go的表现令人难以置信。
我尝试添加最少的睡眠(通过time.Sleep()),但这会大大降低性能。
我的代码转换器工作正常时,整个系统仍然落后。我必须将go任务的优先级更改为“低”或“空闲”,才能再次工作。
我该如何实施使系统保持响应速度的内容?
现在,我开始执行数千个go例程(遍历指针的一部分)。我应该限制例程的数量吗?
答案 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通道中提取一些内容/