Introduction to WaitGroups in Go
In Go, the sync package provides synchronization primitives for concurrent code. One of the most commonly used synchronization tools is the WaitGroup which allows you to wait for a collection of goroutines to finish executing before proceeding further. This tutorial will cover how to use WaitGroup effectively in your Go programs.
What is a WaitGroup?
A WaitGroup is a struct provided by the sync package in Go. It's used to wait for a collection of goroutines to finish executing. The WaitGroup keeps track of how many goroutines are currently running and provides a mechanism to wait until all of them have completed their execution.
Using WaitGroup
To use a WaitGroup in your Go program, you need to follow these steps:
- Create a new
WaitGroup.
- Add the number of goroutines you want to wait for by calling the
Add method.
- Start your goroutines.
- At the end of each goroutine, call the
Done method to indicate that it has completed its execution.
- Finally, call the
Wait method on the WaitGroup to block until all goroutines have finished.
Let's walk through an example to illustrate how this works:
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // Decrements the WaitGroup counter when the function completes
fmt.Printf("Worker %d starting\n", id)
// Simulate some work
for i := 0; i < 3; i++ {
fmt.Printf("Worker %d: working...\n", id)
}
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
numWorkers := 5
wg.Add(numWorkers) // Add the number of goroutines we want to wait for
for i := 0; i < numWorkers; i++ {
go worker(i, &wg)
}
// Wait for all goroutines to finish
wg.Wait()
fmt.Println("All workers have finished")
}
In this example, we have a worker function that simulates some work by printing messages. In the main function, we create a new WaitGroup and add the number of goroutines we want to wait for using the Add method. Then, we start multiple goroutines, each calling the worker function. After starting all goroutines, we call the Wait method to block until all goroutines have finished executing.
Conclusion
WaitGroup is a useful tool for coordinating concurrent operations in Go. By using WaitGroup, you can ensure that certain tasks are completed before proceeding further in your program. Remember to call Add, Done, and Wait methods correctly to avoid race conditions and deadlocks in your concurrent code.