From 7a9ad0c8ccbe0cdd4210dada7b52c54c04428714 Mon Sep 17 00:00:00 2001 From: Arceliar Date: Sat, 3 Aug 2019 23:10:37 -0500 Subject: [PATCH] add workerpool to util --- src/util/workerpool.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/util/workerpool.go diff --git a/src/util/workerpool.go b/src/util/workerpool.go new file mode 100644 index 00000000..fd37f397 --- /dev/null +++ b/src/util/workerpool.go @@ -0,0 +1,29 @@ +package util + +import "runtime" + +var workerPool chan func() + +func init() { + maxProcs := runtime.GOMAXPROCS(0) + if maxProcs < 1 { + maxProcs = 1 + } + workerPool = make(chan func(), maxProcs) + for idx := 0; idx < maxProcs; idx++ { + go func() { + for f := range workerPool { + f() + } + }() + } +} + +// WorkerGo submits a job to a pool of GOMAXPROCS worker goroutines. +// This is meant for short non-blocking functions f() where you could just go f(), +// but you want some kind of backpressure to prevent spawning endless goroutines. +// WorkerGo returns as soon as the function is queued to run, not when it finishes. +// In Yggdrasil, these workers are used for certain cryptographic operations. +func WorkerGo(f func()) { + workerPool <- f +}