Waitgroups
package main
import(
"fmt"
"time"
"math/rand"
"sync"
)
var wait sync.WaitGroup // This creates a WaitGroup, to be used later
func Printer(a int){
defer wait.Done() // Done signals that this gorutine is done doing work, decrementing semaphore counter
time.Sleep(time.Millisecond * time.Duration(rand.Intn(100)))
fmt.Println("a is: ", a)
}
func main(){
max_routine := 10
wait.Add(max_routine) // This adds maximum counter to waithgroup should wait before terminating main program
fmt.Println("At start")
for i := 0; i < max_routine; i++ {
fmt.Println("Sending to routine: ", i)
go Printer(i)
}
wait.Wait() // This waits for semaphore counter to be 0 and then terminates current program
fmt.Println("At end!")
}
// time.Duration(rand.Intn(100)) will make goroutine sleep for varying time
//At the start
//Sending to routine: 0
//Sending to routine: 1
//Sending to routine: 2
//Sending to routine: 3
//Sending to routine: 4
//Sending to routine: 5
//Sending to routine: 6
//Sending to routine: 7
//Sending to routine: 8
//Sending to routine: 9
//a is: 9
//a is: 5
//a is: 6
//a is: 7
//a is: 2
//a is: 8
//a is: 3
//a is: 0
//a is: 4
//a is: 1
//
//At the end!Last updated