[ā§Ē.ā§Š] āĻāϝāĻŧā§āĻāĻā§āϰā§āĻĒ ( WaitGroup)
Go āϤ⧠WaitGroup āĻšāϞ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύāĻžāϞāĻŋāĻāĻŋ āϝāĻž āĻ āύā§āĻāĻā§āϞ⧠āĻā§-āϰā§āĻāĻŋāύ āĻā§ āĻāύāĻāĻžāϰā§āύā§āĻāϞāĻŋ āϰāĻžāύ āĻāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤ āĻāĻŽāϰāĻž āĻā§-āϰā§āĻāĻŋāύ āĻ āĻĻā§āĻā§āĻāĻŋ āĻāĻāĻāĻŋ āĻā§-āϰā§āĻāĻŋāύ āϤāĻžāϰ āϰā§āϏāĻĒāύā§āϏ āĻĒāĻžāĻ āĻžāύā§āϰ āĻāĻā§āĻ āĻ āύā§āĻ āϏāĻŽā§ āĻŽā§āĻāύ āĻā§-āϰā§āĻāĻŋāύ āĻŦāύā§āϧ āĻšā§ā§ āϝāĻžā§, āϏā§āĻ āĻĒā§āϰāĻŦāϞā§āĻŽ āĻĻā§āϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž time.Sleep() āĻŽā§āĻĨāĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŋāϞāĻžāĻŽāĨ¤ āϏā§āĻ āĻāĻžāĻāĻāĻžāĻ āĻāĻŽāϰāĻž WaitGroup āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ WaitGroup āĻŽā§āĻāύ āĻā§-āϰā§āĻāĻŋāύ āĻā§ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻĢā§āϰā§āϏ āĻāϰ⧠āϝāϤāĻā§āώāĻŖ āĻĒāϰā§āϝāύā§āϤ āĻ āύā§āϝ āĻā§-āϰā§āĻāĻŋāύ āĻāϰ āĻāĻžāĻ āĻļā§āώ āύāĻž āĻšā§āĨ¤Â
 WaitGroup sync āĻĒā§āϝāĻžāĻā§āĻā§āϰ āϤāĻŋāύāĻāĻŋ āĻĢāĻžāĻāĻļāύ āύāĻŋā§ā§ āĻāĻžāĻ āĻāϰā§, āϤāĻžāĻšāϞ⧠:Â
Â
ā§§āĨ¤ Add(int) āĻāĻ āĻĢāĻžāĻāĻļāύ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰāĻž āĻšā§ āĻŽā§āĻāύ āĻā§-āϰā§āĻāĻŋāύ āĻāϤā§āĻā§āϞ⧠āĻā§-āϰā§āĻāĻŋāύ āĻāϰ āĻāύā§āϝ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāĻŦā§āĨ¤ Add() āĻĢāĻžāĻāĻļāύ āϏāϰā§āĻŦāĻĻāĻžāĻ āĻāύā§āĻāĻŋāĻāĻžāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āύāĻŋā§ā§ āĻĨāĻžāĻā§āĨ¤
⧍āĨ¤ Wait() āĻĢāĻžāĻāĻļāύ āĻā§āĻĄ āĻŦā§āϞāĻ āĻāϰ⧠āϰāĻžāĻā§ āϝāϤāĻā§āώāύ āĻĒāϰā§āϝāύā§āϤ Add() āĻĢāĻžāĻāĻļāύā§āϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻļā§āύā§āϝ āύāĻž āĻšā§āĨ¤
ā§ŠāĨ¤ Done() āĻĢāĻžāĻāĻļāύ āĻāĻāĻāĻŋ āĻā§-āϰā§āĻāĻŋāύ āĻāϰ āĻāĻā§āϏā§āĻāĻŋāĻāĻļāύ āĻļā§āώ āĻšāϞ⧠Add() āĻĢāĻžāĻāĻļāύā§āϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻāϰ āĻŽāĻžāύ āĻāĻ āĻāϰ⧠āĻāĻŽāĻŋā§ā§ āĻĻā§ā§āĨ¤Â
āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻāĻž āϝāĻžāĻ :Â
package main
import (
"fmt"
"sync"
"time"
)
func routine(waitgroup *sync.WaitGroup, number int) {
defer waitgroup.Done()
fmt.Printf("Starting routine %d \n", number)
time.Sleep(time.Second)
fmt.Printf("Done with routine %d \n", number)
}
func main() {
fmt.Println("Starting main Goroutine")
var waitgroup sync.WaitGroup
for i := 0; i < 5; i++ {
waitgroup.Add(1)
go routine(&waitgroup, i)
}
waitgroup.Wait()
fmt.Println("Finishing main Goroutine")
}
// Output :
// Starting main Goroutine
// Starting routine 4
// Starting routine 2
// Starting routine 3
// Starting routine 0
// Starting routine 1
// Done with routine 1
// Done with routine 0
// Done with routine 3
// Done with routine 4
// Done with routine 2
// Finishing main Goroutine
āĻāĻ āĻāĻĻāĻžāĻšāϰāĻŖā§, āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āύāϤā§āύ WaitGroup āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ waitgroup āϤā§āϰāĻŋ āĻāϰā§āĻāĻŋ āĻāĻŦāĻ & āĻ āĻĒāĻžāϰā§āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠routine() āĻĢāĻžāĻāĻļāύ⧠āĻāĻāĻāĻŋ āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻĒāĻžāϏ āĻāϰā§āĻāĻŋāĨ¤ āĻāĻāĻŋ routine() āĻĢāĻžāĻāĻļāύāĻā§ āϤāĻžāϰ āĻāĻžāĻ āĻļā§āώ āĻāϰāĻžāϰ āĻĒāϰ Done() āĻŽā§āĻĨāĻĄāĻā§ āĻāϞ āĻāϰ⧠WaitGroup āĻāĻĒāĻĄā§āĻ āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§ā§āĨ¤Â
Â
           āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž Add(1) āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻā§-āϰā§āĻāĻŋāύ āĻāĻĄÂ āĻāϰā§āĻāĻŋ, āϤāĻžāϰāĻĒāϰ routine() āĻā§-āϰā§āĻāĻŋāύ āĻā§ āĻāϞ āĻāϰā§āĻāĻŋ āϝāĻžāϰ āĻĒā§ā§āύā§āĻāĻžāϰ &waitgrop āĻāĻŦāĻ āĻāύā§āĻāĻŋāĻāĻžāϰ i āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻšāĻŋāϏā§āĻŦā§ āĻĒāĻžāĻ āĻŋā§ā§āĻāĻŋāĨ¤ routine() āĻĢāĻžāĻāĻļāύ⧠defer waitgroup.Done() āĻāϞ āĻāϰāĻž āĻšā§ā§āĻā§ āϝāĻžāϤ⧠āĻāĻāĻāĻŋ āĻā§-āϰā§āĻāĻŋāύ āĻļā§āώ āĻšāϞ⧠Add() āĻāϰ āĻŽāĻžāύ āĻĄāĻŋāĻā§āϰāĻŋāĻŽā§āύā§āĻ āĻāϰ⧠āĻĻā§ā§āĨ¤ āϏāĻŦ āĻā§-āϰā§āĻāĻŋāύ āĻāϰ āĻāĻžāĻ āĻļā§āώ āύāĻž āĻšāĻā§āĻž āĻĒāϰā§āϝāύā§āϤ āĻŽā§āĻāύ āĻā§-āϰā§āĻāĻŋāύ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāĻŦā§ waitgroup.Wait() āĻāϰ āĻāύā§āϝāĨ¤ āϏāĻŦ āĻļā§āώā§Â āĻŽā§āĻāύ āĻā§-āϰā§āĻāĻŋāύ āĻāĻā§āϏā§āĻāĻŋāĻāĻ āĻšā§ā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻŦāύā§āϧ āĻšā§ā§ āϝāĻžāĻŦā§āĨ¤
āĻ ā§āϝāĻžāύā§āύāĻŋāĻŽāĻžāϏ āĻā§-āϰā§āĻāĻŋāύ āĻāϰ āϏāĻžāĻĨā§ Waitgroup
āĻ ā§āϝāĻžāύā§āύāĻŋāĻŽāĻžāϏ āĻā§-āϰā§āĻāĻŋāύ āĻāϰ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ :
Go func ( parameter list ) {
body..........
} ( argument list )
āĻāĻĻāĻžāĻšāϰāĻŖāĻāĻŋ āĻĻā§āĻāĻŋ :
package main
import (
"fmt"
"sync"
"time"
)
func main() {
fmt.Println("Starting main Goroutine")
var waitgroup sync.WaitGroup
waitgroup.Add(5)
for i := 0; i < 5; i++ {
go func(waitgroup *sync.WaitGroup, number int) {
defer waitgroup.Done()
fmt.Printf("Starting routine %d \n", number)
time.Sleep(time.Second)
fmt.Printf("Done with routine %d \n", number)
}(&waitgroup, i)
}
waitgroup.Wait()
fmt.Println("Finishing main Goroutine")
}
// Output :
// Starting main Goroutine
// Starting routine 4
// Starting routine 0
// Starting routine 1
// Starting routine 2
// Starting routine 3
// Done with routine 0
// Done with routine 4
// Done with routine 1
// Done with routine 3
// Done with routine 2
// Finishing main Goroutine