mirror of
https://github.com/cwinfo/yggdrasil-go.git
synced 2024-12-24 13:55:40 +00:00
30 lines
738 B
Go
30 lines
738 B
Go
|
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
|
||
|
}
|