package events import ( "sync" "github.com/remeh/sizedwaitgroup" "github.com/runatlantis/atlantis/server/events/command" ) type prjCmdRunnerFunc func(ctx command.ProjectContext) command.ProjectResult func runProjectCmdsParallel( cmds []command.ProjectContext, runnerFunc prjCmdRunnerFunc, poolSize int, ) command.Result { var results []command.ProjectResult mux := &sync.Mutex{} wg := sizedwaitgroup.New(poolSize) for _, pCmd := range cmds { pCmd := pCmd var execute func() wg.Add() execute = func() { defer wg.Done() res := runnerFunc(pCmd) mux.Lock() results = append(results, res) mux.Unlock() } go execute() } wg.Wait() return command.Result{ProjectResults: results} } func runProjectCmds( cmds []command.ProjectContext, runnerFunc prjCmdRunnerFunc, ) command.Result { var results []command.ProjectResult for _, pCmd := range cmds { res := runnerFunc(pCmd) results = append(results, res) } return command.Result{ProjectResults: results} }