// _ _ // __ _____ __ ___ ___ __ _| |_ ___ // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ // \ V V / __/ (_| |\ V /| | (_| | || __/ // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| // // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. // // CONTACT: hello@weaviate.io // 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() }