Goroutines in Go
Goroutines Go में concurrent programming का एक मुख्य हिस्सा हैं। Goroutines lightweight threads की तरह होते हैं, जिनका उपयोग Go में concurrent tasks को execute करने के लिए किया जाता है। जब भी आप किसी function या method को एक नए goroutine के रूप में execute करते हैं, तो वह function अलग से, parallel में execute होता है, जिससे आपका main program बिना रुके चलता रहता है।
Basic Syntax of Goroutines
Goroutine को start करने के लिए आप go
keyword का उपयोग करते हैं। जब आप किसी function call से पहले go
keyword लगाते हैं, तो वह function एक नए goroutine में execute होता है।
Example: Basic Goroutine
package main
import (
"fmt"
"time"
)
func sayHello() {
fmt.Println("Hello, Go!")
}
func main() {
go sayHello() // This starts a new goroutine
time.Sleep(1 * time.Second)
fmt.Println("Main function finished")
}
Explanation:
go sayHello()
: यहांsayHello
function एक नए goroutine में execute हो रहा है।time.Sleep(1 * time.Second)
: Sleep का उपयोग इसलिए किया गया है ताकि main function थोड़ा wait करे और goroutine अपना काम पूरा कर सके।
Output: "Hello, Go!" और "Main function finished"।
1. Concurrency vs Parallelism
- Concurrency: Go में Goroutines concurrency को manage करने के लिए उपयोग की जाती हैं, जिसका मतलब है कि multiple tasks एक ही समय पर execute हो सकते हैं, भले ही वे physically parallel न हों।
- Parallelism: अगर आपका computer multiple cores का उपयोग कर रहा है, तो Go का scheduler Goroutines को parallel में भी run कर सकता है, यानी कि वे physically एक ही समय पर अलग-अलग cores पर execute हो सकते हैं।
2. Goroutines are Lightweight
Goroutines को lightweight इसलिए कहा जाता है क्योंकि इनका memory footprint बहुत कम होता है। जब आप एक goroutine start करते हैं, तो यह केवल कुछ KBs की memory consume करता है, जबकि traditional threads कई MBs की memory ले सकते हैं। इसी कारण आप Go में हजारों goroutines को efficiently run कर सकते हैं।
3. Goroutines and Functions
Goroutines में आप किसी भी function को run कर सकते हैं। यह function एक simple function हो सकता है या anonymous function भी हो सकता है।
Example: Goroutine with Anonymous Function
package main
import (
"fmt"
"time"
)
func main() {
go func() {
fmt.Println("This is an anonymous goroutine!")
}()
time.Sleep(1 * time.Second)
fmt.Println("Main function finished")
}
Explanation:
go func() { ... }()
: यह एक anonymous function है जो goroutine में run हो रहा है।
Output: "This is an anonymous goroutine!" और "Main function finished"।
4. Goroutines and Channels
Goroutines के बीच communication के लिए channels का उपयोग किया जाता है। Channels एक pipe की तरह होते हैं, जिनमें एक goroutine से data को send और receive किया जा सकता है।
Example: Goroutines with Channels
package main
import (
"fmt"
"time"
)
func calculateSum(a, b int, result chan int) {
sum := a + b
result <- sum // Send result to channel
}
func main() {
result := make(chan int)
go calculateSum(3, 4, result)
sum := <-result // Receive result from channel
fmt.Println("Sum:", sum)
}
Explanation:
result := make(chan int)
: यह एक integer type का channel create करता है।go calculateSum(3, 4, result)
: यह function एक नए goroutine में execute होता है और calculation के बाद result को channel में भेजता है।sum := <-result
: यह result को channel से receive करता है।
Output: "Sum: 7"।
5. Waiting for Goroutines
अगर आपको ensure करना है कि सभी goroutines finish हो जाएं, तो आप sync.WaitGroup
का उपयोग कर सकते हैं। यह एक synchronization primitive है जो multiple goroutines के completion को track करने में मदद करता है।
Example: Using WaitGroup to Wait for Goroutines
package main
import (
"fmt"
"sync"
"time"
)
func sayHello(wg *sync.WaitGroup) {
defer wg.Done() // Mark this goroutine as done
fmt.Println("Hello, Go!")
}
func main() {
var wg sync.WaitGroup
wg.Add(1) // Indicate that we are waiting for one goroutine
go sayHello(&wg)
wg.Wait() // Wait for all goroutines to finish
fmt.Println("Main function finished")
}
Explanation:
wg.Add(1)
: यह बताता है कि एक goroutine को track किया जाएगा।wg.Done()
: जब goroutine अपना काम complete कर लेता है, तोDone()
function call किया जाता है।wg.Wait()
: यह main goroutine को तब तक रोकता है जब तक कि सभी tracked goroutines complete नहीं हो जाते।
Output: "Hello, Go!" और "Main function finished"।
6. Error Handling in Goroutines
Goroutines में error handling करना थोड़ा tricky हो सकता है। आप errors को handle करने के लिए channels का उपयोग कर सकते हैं ताकि goroutine की errors को main routine तक pass किया जा सके।
Example: Error Handling with Channels
package main
import (
"errors"
"fmt"
)
func divide(a, b int, result chan<- int, err chan<- error) {
if b == 0 {
err <- errors.New("division by zero")
return
}
result <- a / b
}
func main() {
result := make(chan int)
err := make(chan error)
go divide(10, 0, result, err)
select {
case res := <-result:
fmt.Println("Result:", res)
case e := <-err:
fmt.Println("Error:", e)
}
}
Explanation:
divide(a, b int, result chan<- int, err chan<- error)
: यह function division operation perform करता है और result या error को channels में send करता है।select
: यह select statement check करता है कि कौन-सा channel पहले respond करता है, और उसी के आधार पर result या error को print करता है।
Output: "Error: division by zero"।
Summary
- Goroutines: Go में lightweight threads होते हैं, जो concurrent execution को manage करने के लिए उपयोग किए जाते हैं।
- Concurrency: Multiple tasks को एक साथ execute करने के लिए goroutines का उपयोग किया जाता है।
- Communication: Goroutines के बीच communication के लिए channels का उपयोग किया जाता है।
- Synchronization:
sync.WaitGroup
का उपयोग goroutines को synchronize करने और ensure करने के लिए किया जाता है कि सभी goroutines complete हो जाएं। - Error Handling: Channels का उपयोग करके goroutines की errors को handle किया जा सकता है।
Goroutines Go में concurrent और parallel programming के लिए एक powerful tool हैं। इन्हें समझना और effectively use करना Go programming में बहुत आवश्यक है। अगर आपको goroutines के बारे में और जानकारी चाहिए या कोई specific सवाल है, तो बताइए!
No comments:
Post a Comment