Concurrency / Limiting concurrency with a semaphor

Run Settings
LanguageGo
Language Version
Run Command
package main import ( "fmt" "sync" "time" ) var ( semaphoreSize = 4 mu sync.Mutex totalTasks int curConcurrentTasks int maxConcurrentTasks int ) func timeConsumingTask() { mu.Lock() totalTasks++ curConcurrentTasks++ if curConcurrentTasks > maxConcurrentTasks { maxConcurrentTasks = curConcurrentTasks } mu.Unlock() // in real system this would be a CPU intensive operation time.Sleep(10 * time.Millisecond) mu.Lock() curConcurrentTasks-- mu.Unlock() } func main() { sem := make(chan struct{}, semaphoreSize) var wg sync.WaitGroup for i := 0; i < 32; i++ { // acquire semaphore sem <- struct{}{} wg.Add(1) go func() { timeConsumingTask() // release semaphore <-sem wg.Done() }() } // wait for all task to finish wg.Wait() fmt.Printf("total tasks : %d\n", totalTasks) fmt.Printf("max concurrent tasks: %d\n", maxConcurrentTasks) }
Editor Settings
Theme
Key bindings
Full width
Lines