Golang_HomeWork/hw05_parallel_execution/saw_shift.go

31 lines
663 B
Go

package hw05_parallel_execution //nolint:golint,stylecheck
import (
"sync"
)
// Функция, решающая задачу методом пилообразного сдвига.
func RunSawShift(tasks []Task, n int, m int) error {
errs := Errors{}
for i := 0; i < len(tasks); i += n {
wg := sync.WaitGroup{}
for g := 1; g <= n && i+g < len(tasks); g++ {
wg.Add(1)
go func(rt Task, errs *Errors) {
defer wg.Done()
err := rt()
if err != nil {
errs.mx.Lock()
errs.count++
errs.mx.Unlock()
}
}(tasks[i+g], &errs)
}
wg.Wait()
if m > 0 && errs.count > m {
return ErrErrorsLimitExceeded
}
}
return nil
}