diff options
author | Matthew Heon <matthew.heon@pm.me> | 2020-06-04 14:28:01 -0400 |
---|---|---|
committer | Matthew Heon <matthew.heon@pm.me> | 2020-06-05 11:31:05 -0400 |
commit | 89a1e7db39ed1015762d733379a4a5d443b1f4de (patch) | |
tree | 1b99dd8c457c10b96110d86c091a71d13ca3df1d /pkg/parallel/parallel.go | |
parent | bf8337b3fc488d3fc449a7622ae7744a67b9f348 (diff) | |
download | podman-89a1e7db39ed1015762d733379a4a5d443b1f4de.tar.gz podman-89a1e7db39ed1015762d733379a4a5d443b1f4de.tar.bz2 podman-89a1e7db39ed1015762d733379a4a5d443b1f4de.zip |
Add parallel execution code for container operations
This code will run container operations in parallel, up to a
given maximum number of threads. Currently, it has only been
enabled for local `podman rm` as a proof of concept.
Signed-off-by: Matthew Heon <matthew.heon@pm.me>
Diffstat (limited to 'pkg/parallel/parallel.go')
-rw-r--r-- | pkg/parallel/parallel.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/pkg/parallel/parallel.go b/pkg/parallel/parallel.go new file mode 100644 index 000000000..c9e4da50d --- /dev/null +++ b/pkg/parallel/parallel.go @@ -0,0 +1,44 @@ +package parallel + +import ( + "sync" + + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + "golang.org/x/sync/semaphore" +) + +var ( + // Maximum number of jobs that will be used. + // Set a low, but non-zero, default. We'll be overriding it by default + // anyways. + numThreads uint = 8 + // Semaphore to control thread creation and ensure numThreads is + // respected. + jobControl *semaphore.Weighted + // Lock to control changing the semaphore - we don't want to do it + // while anyone is using it. + jobControlLock sync.RWMutex +) + +// SetMaxThreads sets the number of threads that will be used for parallel jobs. +func SetMaxThreads(threads uint) error { + if threads == 0 { + return errors.New("must give a non-zero number of threads to execute with") + } + + jobControlLock.Lock() + defer jobControlLock.Unlock() + + numThreads = threads + jobControl = semaphore.NewWeighted(int64(threads)) + logrus.Infof("Setting parallel job count to %d", threads) + + return nil +} + +// GetMaxThreads returns the current number of threads that will be used for +// parallel jobs. +func GetMaxThreads() uint { + return numThreads +} |