package task import ( "sync" ) type Task interface { Execute() error } type ParallelExecutor struct { sync.Mutex tasks sync.WaitGroup errors []error } func (pe *ParallelExecutor) track(err error) { if err == nil { return } pe.Lock() pe.errors = append(pe.errors, err) pe.Unlock() } func (pe *ParallelExecutor) Execute(task Task) { pe.tasks.Add(1) go func() { pe.track(task.Execute()) pe.tasks.Done() }() } func (pe *ParallelExecutor) Wait() { pe.tasks.Wait() } func (pe *ParallelExecutor) Errors() []error { return pe.errors }