Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package compressionhelpers | |
import ( | |
"math" | |
"runtime" | |
"sync" | |
) | |
type Action func(taskIndex uint64) | |
func Concurrently(n uint64, action Action) { | |
n64 := float64(n) | |
workerCount := runtime.GOMAXPROCS(0) | |
wg := &sync.WaitGroup{} | |
split := uint64(math.Ceil(n64 / float64(workerCount))) | |
for worker := uint64(0); worker < uint64(workerCount); worker++ { | |
wg.Add(1) | |
go func(workerID uint64) { | |
defer wg.Done() | |
for i := workerID * split; i < uint64(math.Min(float64((workerID+1)*split), n64)); i++ { | |
action(i) | |
} | |
}(worker) | |
} | |
wg.Wait() | |
} | |