in astro/utils/parallel.go [27:45]
func Parallel(ctx context.Context, maxConcurrent int, fns ...func()) {
wg := sync.WaitGroup{}
sem := semaphore.NewWeighted(int64(maxConcurrent))
for _, fn := range fns {
// https://medium.com/@deckarep/gos-extended-concurrency-semaphores-part-1-5eeabfa351ce
if err := sem.Acquire(ctx, 1); err != nil {
break
}
wg.Add(1)
go func(fn func()) {
defer wg.Done()
fn()
sem.Release(1)
}(fn)
}
wg.Wait()
}