Skip to content

03 Advanced Go (Concurrency)

Go famous hi Concurrency ke liye hai. Matlab ek saath bahut sare kaam karna.

1. Goroutines (Lightweight Threads) 🏃‍♂️

Agar aap function call ke aage go laga dein, to wo background me chalega (Main program rukega nahi).

package main
import (
"fmt"
"time"
)
func sayHello(n int) {
for i := 0; i < n; i++ {
fmt.Println("Hello", i)
time.Sleep(100 * time.Millisecond)
}
}
func main() {
go sayHello(5) // Background me chalega
fmt.Println("Main function chal raha hai...")
time.Sleep(1 * time.Second) // Wait karna padega warna main khatam ho jayega!
}

Note: Goroutines bahut lightweight hoti hain (sirf 2KB memory).


2. Channels (Talking between Goroutines) 📞

Goroutines ek doosre se baat karne ke liye Channels use karti hain.

func main() {
msgChannel := make(chan string) // Channel banaya
go func() {
msgChannel <- "Hi from Goroutine! 👋" // Message bheja
}()
msg := <-msgChannel // Message receive kiya
fmt.Println(msg)
}

Unbuffered vs Buffered

  • Unbuffered: Sender block ho jata hai jab tak koi Receiver na ho.
  • Buffered: make(chan string, 2). 2 messages tak store kar sakta hai bina block huye.

3. WaitGroups (Intezaar karna) ⏳

time.Sleep use karna unprofessional hai. Hum sync.WaitGroup use karte hain.

import "sync"
var wg sync.WaitGroup
func worker(id int) {
defer wg.Done() // Kaam khatam hone par batao
fmt.Printf("Worker %d starting\n", id)
}
func main() {
for i := 1; i <= 3; i++ {
wg.Add(1) // 1 Worker add kiya
go worker(i)
}
wg.Wait() // Sabke khatam hone ka wait karo
}
---
## 4. Race Conditions & Mutex 🔒
Jab do Goroutines same variable ko ek saath access karein, to data corrupt ho sakta hai (**Race Condition**).
Isse bachne ke liye hum **Mutex (Mutual Exclusion)** use karte hain.
```go
import "sync"
var count = 0
var mu sync.Mutex
func increment() {
mu.Lock() // Darwaza band (Koi aur nahi aa sakta)
count++ // Critical Section
mu.Unlock() // Darwaza khula
}

5. Select (Multi-Channel Handler) 🚦

Agar multiple channels se data aana ho, to select use karte hain.

select {
case msg1 := <-chan1:
fmt.Println("Channel 1 se aya:", msg1)
case msg2 := <-chan2:
fmt.Println("Channel 2 se aya:", msg2)
default:
fmt.Println("Abhi koi data nahi hai.")
}