package main
import (
"fmt"
"sync"
"time"
)
func heavyTask(id int, wg *sync.WaitGroup, semaphore chan struct{}) {
defer func() {
wg.Done()
<-semaphore
}()
time.Sleep(1 * time.Second)
fmt.Println("Goroutine", id, "selesai")
}
func main() {
var wg sync.WaitGroup
numTasks := 1000000
semaphore := make(chan struct{}, 100)
semaphore <- struct{}{}
startTime := time.Now()
wg.Add(numTasks)
for i := 0; i < numTasks; i++ {
go heavyTask(i, &wg, semaphore)
}
wg.Wait()
elapsedTime := time.Since(startTime)
fmt.Println("Semua goroutine selesai dalam waktu:", elapsedTime)
}