Corporate Training
Request Demo
Click me
Menu
Let's Talk
Request Demo

Tutorials

Concurrency and Goroutines

17. Concurrency and Goroutines

Concurrency is a key feature in Go that allows you to write programs that can perform multiple tasks simultaneously. Goroutines, lightweight threads managed by the Go runtime, enable concurrent execution. Let's explore concurrency, goroutines, and synchronization in Go in detail, along with examples.

Concurrency and Goroutines:

Concurrency is the ability of a program to manage multiple tasks concurrently, often on different threads. Goroutines are a way to achieve concurrency in Go. They are lightweight, managed by the Go runtime, and allow you to run functions concurrently.

Creating a Goroutine:

To create a goroutine, use the 'go'keyword followed by the function call.

func main() {
go someFunction() // Create and start a goroutine
// The main function continues to execute concurrently with someFunction
}

 

Example of Goroutine:
func printNumbers() {
for i := 1; i <= 5; i++ {
fmt.Println(i)
}
}

func main() {
go printNumbers() // Create a goroutine to print numbers
fmt.Println("Main function") // This will be printed concurrently
}

 

Synchronization using WaitGroups:

In concurrent programs, you might need to wait for goroutines to complete before proceeding. The 'sync'package provides the 'WaitGroup'type for synchronization.

Example using WaitGroups:
func printNumbers(wg *sync.WaitGroup) {
    defer wg.Done()      // Decrement the WaitGroup counter when done
    for i := 1; i <= 5; i++ {
        fmt.Println(i)
    }
}

func main() {
    var wg sync.WaitGroup
    wg.Add(1)                 // Increment the WaitGroup counter
    go printNumbers(&wg)      // Create a goroutine
    wg.Wait()                 // Wait until the WaitGroup counter becomes zero
    fmt.Println("Main function")
}

 

Channels for Communication:

Goroutines communicate using channels, which provide a way to send and receive data between them.

Creating a Channel:
ch := make(chan int)           // Create an unbuffered channel for integers

 

Sending and Receiving Data:
ch <- 42     // Send value 42 to the channel
value := <-ch // Receive a value from the channel

 

Example using Channels:
func main() {
ch := make(chan int)

go func() {
ch <- 42 // Send value 42 to the channel
}()

value := <-ch // Receive the value from the channel
fmt.Println(value) // Output: 42
}

 

Select Statement:

The 'select'statement allows you to wait on multiple communication operations at once.

select {
case value := <-ch1:
// Handle value received from ch1
case ch2 <- 42:
// Send value 42 to ch2
}

 

Summary:

  • Concurrency is the ability to manage multiple tasks concurrently.
  • Goroutines are lightweight threads managed by the Go runtime.
  • Use the  'go'keyword to create and start goroutines.
  • Synchronization can be achieved using 'sync.WaitGroup'.
  • Communication between goroutines is facilitated using channels.
  • The 'select' statement is used to handle multiple channel operations.

Understanding concurrency and goroutines in Go allows you to design efficient and responsive programs that can perform multiple tasks concurrently. Proper synchronization using tools like 'WaitGroup'and channels ensures safe and effective concurrent execution.