Vivasoft-logo

[ā§Ē.ā§Š] āĻ“āϝāĻŧ⧇āϟāĻ—ā§āϰ⧁āĻĒ ( 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