Я пытаюсь построить асинхронный кодек. Я реализовал диспетчер заданий, который имеет доступ к буферизованному каналу заданий
var JobChannel chan Job = make(chan Job, 100000)
диспетчер принимает в качестве входных данных количество работников и назначает им работу
func StartDispacher(numberOfWorkers int){
// start workers
wg := &sync.WaitGroup{}
wg.Add(numberOfWorkers)
for i := int(1); i <= numberOfWorkers; i++ {
go func(i int) {
defer wg.Done()
for j := range JobChannel {
doWork(i, j)
}
}(i)
}
}
моя основная функция запускает диспетчер и продолжает отдавать ему задания (в данном случае 200000 заданий)
workDispatcher.StartDispacher(2*runtime.NumCPU())
for i := 0; i < 200000; i++ {
j := workDispatcher.Job{
BytePacket: d,
JobType: workDispatcher.DECODE_JOB,
}
workDispatcher.JobChannel <- j
}
после экспериментов: оказывается, есть 2 фактора, которые влияют на производительность этого кода
- размер буферизованного канала
JobChannel
- количество рабочих
func StartDispacher(numberOfWorkers int)
Существует ли стандартный способ найти оптимальные значения для этих параметров и возможно ли сделать эти значения независимыми от физической настройки машины, на которой выполняется код?