Я создаю приложение Go, которое использует рабочий пул горутин, сначала я запускаю пул, создавая несколько рабочих. Мне было интересно, какое было бы оптимальное количество рабочих в многоядерном процессоре, например в ЦП с 4 ядрами? В настоящее время я использую следующий подход:
// 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 и объединяет их результаты в один ответ. Каждый вызов может выполняться независимо от других, так как порядок результатов не имеет значения. Я отправляю вызовы в рабочий пул, где каждый вызов выполняется в одной доступной горутине асинхронным способом. Мой поток запросов продолжает прослушивать каналы возврата при извлечении и агрегировании результатов, как только рабочий поток завершен. Когда все будет сделано, в качестве ответа возвращается окончательный агрегированный результат. Поскольку каждый внешний вызов API может отображать переменное время ответа, некоторые вызовы могут быть выполнены раньше, чем другие. Насколько я понимаю, выполнение этого параллельным способом было бы лучше с точки зрения производительности, по сравнению с тем, чтобы делать это синхронным способом, вызывая каждый внешний API один за другим.
GOMAXPROCS
в 99,99% современных приложений Go. И установка числа процессоров + 1 никогда не имеет смысла, AFAIK. Вам следует установить это только в том случае, если вы хотите уменьшить значение по умолчанию. - person Flimzy   schedule 24.12.2017