我正在构建一个使用 goroutines 的“工作池”的 Go 应用程序,最初我启动池创建了一些工作程序。我想知道多核处理器中的最佳工作人员数量是多少,例如在具有 4 核的 CPU 中?我目前正在使用以下方法:
// init pool
numCPUs := runtime.NumCPU()
runtime.GOMAXPROCS(numCPUs + 1) // numCPUs hot threads + one for async tasks.
maxWorkers := numCPUs * 4
jobQueue := make(chan job.Job)
module := Module{
Dispatcher: job.NewWorkerPool(maxWorkers),
JobQueue: jobQueue,
Router: router,
}
// A buffered channel that we can send work requests on.
module.Dispatcher.Run(jobQueue)
完整的实现如下
job.NewWorkerPool(maxWorkers) 和 module.Dispatcher.Run(jobQueue)
我使用工作池的用例:我有一个服务,它接受请求并调用多个外部 API 并将它们的结果聚合到一个响应中。每个调用都可以独立于其他调用,因为结果的顺序无关紧要。我将调用分派到工作池,每个调用都在一个可用的 goroutine 中以异步方式完成。一旦工作线程完成,我的“请求”线程会在获取和聚合结果的同时继续监听返回通道。完成所有操作后,最终聚合结果将作为响应返回。由于每个外部 API 调用可能会呈现可变响应时间,因此某些调用可以比其他调用更早完成。