diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2018-10-11 10:55:18 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-11 10:55:18 -0700 |
commit | 83327e6973c118e9c36a9393496981894f8908a0 (patch) | |
tree | 2b2426eea83d662ba514c2235b92b1884b13bca2 /cmd/podman/utils.go | |
parent | 6983e00a2808b29481d1cb460aab2eea1db6ef73 (diff) | |
parent | 9be18c2eaf0fbd9f868ecab54fd5029881e132f9 (diff) | |
download | podman-83327e6973c118e9c36a9393496981894f8908a0.tar.gz podman-83327e6973c118e9c36a9393496981894f8908a0.tar.bz2 podman-83327e6973c118e9c36a9393496981894f8908a0.zip |
Merge pull request #1614 from baude/parastop
Stop containers in parallel fashion
Diffstat (limited to 'cmd/podman/utils.go')
-rw-r--r-- | cmd/podman/utils.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/cmd/podman/utils.go b/cmd/podman/utils.go index 89ec48dbe..1b767532e 100644 --- a/cmd/podman/utils.go +++ b/cmd/podman/utils.go @@ -5,6 +5,7 @@ import ( "fmt" "os" gosignal "os/signal" + "sync" "github.com/containers/libpod/libpod" "github.com/docker/docker/pkg/signal" @@ -215,3 +216,50 @@ func getPodsFromContext(c *cli.Context, r *libpod.Runtime) ([]*libpod.Pod, error } return pods, lastError } + +type pFunc func() error + +type workerInput struct { + containerID string + parallelFunc pFunc +} + +// worker is a "threaded" worker that takes jobs from the channel "queue" +func worker(wg *sync.WaitGroup, jobs <-chan workerInput, results map[string]error) { + for j := range jobs { + err := j.parallelFunc() + results[j.containerID] = err + wg.Done() + } +} + +// parallelExecuteWorkerPool takes container jobs and performs them in parallel. The worker +// int is determines how many workers/threads should be premade. +func parallelExecuteWorkerPool(workers int, functions []workerInput) map[string]error { + var ( + wg sync.WaitGroup + ) + results := make(map[string]error) + paraJobs := make(chan workerInput, len(functions)) + + // If we have more workers than functions, match up the number of workers and functions + if workers > len(functions) { + workers = len(functions) + } + + // Create the workers + for w := 1; w <= workers; w++ { + go worker(&wg, paraJobs, results) + } + + // Add jobs to the workers + for _, j := range functions { + j := j + wg.Add(1) + paraJobs <- j + } + + close(paraJobs) + wg.Wait() + return results +} |