Golang_HomeWork/hw05_parallel_execution/run.go

37 lines
735 B
Go

package hw05_parallel_execution //nolint:golint,stylecheck
import "sync"
func Run(tasks []Task, n int, m int) error {
if m == -1 {
m = len(tasks)
}
task, errs, wg, done := make(chan Task), make(chan error, len(tasks)), sync.WaitGroup{}, make(chan struct{})
defer func() {
close(done)
wg.Wait()
}()
wg.Add(n)
for i := 1; i <= n; i++ {
go func(task chan Task, errs chan error, wg *sync.WaitGroup, done chan struct{}) {
for {
select {
case <-done:
wg.Done()
return
case t := <-task:
if err := t(); err != nil {
errs <- err
}
}
}
}(task, errs, &wg, done)
}
for _, t := range tasks {
task <- t
if len(errs) >= m {
return ErrErrorsLimitExceeded
}
}
return nil
}