【问题标题】:Possibility to NOT hook all available CPU power?是否可以不连接所有可用的 CPU 电源?
【发布时间】:2018-10-24 13:58:14
【问题描述】:

我知道,大多数 go 初学者都问如何拥有执行性 go-routines/并发,这点我几周前通过了。 :-)

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

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

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

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

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

【问题讨论】:

  • 拥有比核心更多的可运行 goroutine 并没有什么好处,所以是的:限制它们。减少 GOMAXPROCS 以限制您编程将使用的线程数和内核数。

标签: windows go concurrency goroutine


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 所以我应该外包进行翻译的部分,并使用某种具有给定优先级的加载器从 main 开始?像 gui+jobs+solver?
  • 这完全取决于您的需求。做任何适合你情况的事情。如果以较低的优先级运行整个事情,我认为没有任何理由让它比这更复杂。
  • 我只是想跳过通过任务管理器手动降低优先级,让它尽可能用户友好。最简单但丑陋的解决方案可能是一个 clickme.cmd,它以低于正常值的 prio 启动 exe ......但这并不聪明。
  • 更新了更多选项。
【解决方案2】:

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

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

for {
    sem <- 1
    go doThis()
}

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

for 循环中的“sem

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    相关资源
    最近更新 更多