Channels in Go
Channels Go में एक synchronization और communication mechanism होते हैं, जो goroutines के बीच data को safely और efficiently transfer करने के लिए उपयोग किए जाते हैं। Channels एक pipeline की तरह काम करते हैं, जिनके जरिए एक goroutine से data को send और दूसरी goroutine से receive किया जा सकता है।
Basic Syntax for Creating a Channel
Channels को declare और initialize करने के लिए make()
function का उपयोग किया जाता है। Channels को specific data type के लिए बनाया जाता है, यानी कि आप channels में सिर्फ उस data type के values को send और receive कर सकते हैं।
ch := make(chan T)
Where T is the data type that the channel will store, such as int
, string
, etc.
Example: Creating and Using a Channel
package main
import (
"fmt"
)
func main() {
// Channel creation
ch := make(chan int)
// Sending data to the channel in a new goroutine
go func() {
ch <- 42 // Send data to the channel
}()
// Receiving data from the channel
result := <-ch // Receive data from the channel
fmt.Println("Received:", result)
}
Explanation:
ch := make(chan int)
: यह एक integer type का channel create करता है।ch <- 42
: इस line में 42 value को channel में भेजा जा रहा है।result := <-ch
: इस line में channel से value को receive किया जा रहा है और इसे result variable में store किया गया है।
Output: "Received: 42"
How Channels Work
- Channels एक goroutine से दूसरे goroutine तक data को pass करते हैं।
- जब आप data को एक channel में send करते हैं, तो sending goroutine तब तक block रहता है जब तक कोई दूसरा goroutine उस data को receive नहीं कर लेता।
- इसी तरह, receiving goroutine भी तब तक block रहता है जब तक channel में कोई data नहीं आ जाता।
1. Buffered and Unbuffered Channels
- Unbuffered Channels: ये channels सिर्फ एक value को hold करते हैं और जब तक value send और receive नहीं होती, दोनों goroutines block रहते हैं।
- Buffered Channels: ये channels एक buffer के साथ आते हैं, यानी कि आप कई values को send कर सकते हैं और receiving goroutine को block किए बिना data भेज सकते हैं। लेकिन जब buffer full हो जाता है, तो sending goroutine block हो जाता है।
Example: Buffered Channel
package main
import (
"fmt"
)
func main() {
// Buffered channel creation with buffer size 2
ch := make(chan int, 2)
// Sending two values to the buffered channel
ch <- 10
ch <- 20
// Receiving values from the channel
fmt.Println(<-ch)
fmt.Println(<-ch)
}
Explanation:
make(chan int, 2)
: यह एक buffered channel है जिसमें 2 values store की जा सकती हैं।ch <- 10
औरch <- 20
: ये दो values बिना block हुए channel में भेजी जा रही हैं।
Output: "10" और "20"
2. Closing a Channel
Channels को close()
function से बंद किया जा सकता है। एक बार channel close हो जाने पर, आप उसमें से data receive कर सकते हैं, लेकिन उसमें और data send नहीं कर सकते।
Example: Closing a Channel
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
// Sending values to the channel
ch <- 10
ch <- 20
// Closing the channel
close(ch)
// Receiving values from the channel
fmt.Println(<-ch)
fmt.Println(<-ch)
// Receiving from closed channel returns zero value
fmt.Println(<-ch) // Output will be zero value of int, which is 0
}
Explanation:
close(ch)
: यह function channel को close कर देता है।- Receiving from a closed channel: Closed channel से data receive किया जा सकता है, लेकिन अगर channel empty है, तो यह zero value return करेगा।
Output: "10", "20", और "0"
3. Checking if a Channel is Closed
Channel से data receive करते समय यह check किया जा सकता है कि channel बंद हो चुका है या नहीं। इसके लिए आप comma-ok syntax का उपयोग कर सकते हैं।
Example: Checking if a Channel is Closed
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2)
// Sending values to the channel
ch <- 10
ch <- 20
// Closing the channel
close(ch)
// Receiving values with a check for closed channel
for {
val, ok := <-ch
if !ok {
fmt.Println("Channel is closed")
break
}
fmt.Println("Received:", val)
}
}
Explanation:
val, ok := <-ch
: यह check करता है कि क्या channel से value मिली है और channel बंद है या नहीं।if !ok
: अगर ok false है, तो इसका मतलब है कि channel बंद हो चुका है।
Output: "Received: 10", "Received: 20", और "Channel is closed"
4. Select Statement with Channels
Go में select
statement का उपयोग multiple channels के साथ concurrent operations को handle करने के लिए किया जाता है। select
statement यह देखता है कि कौन-सा channel ready है, और फिर उस channel से data receive या send करता है।
Example: Select Statement
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
// Goroutine for sending data to ch1
go func() {
time.Sleep(1 * time.Second)
ch1 <- "Message from ch1"
}()
// Goroutine for sending data to ch2
go func() {
time.Sleep(2 * time.Second)
ch2 <- "Message from ch2"
}()
// Using select to receive from whichever channel is ready first
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
}
}
Explanation:
select
: यह wait करता है कि कौन-सा channel पहले ready होता है। जो भी channel पहले ready हो जाता है, उसे process कर लेता है।
Output: "Message from ch1" (चूंकि ch1 पहले 1 सेकंड बाद ready हो जाता है)
5. Goroutines and Channels Together
Channels और goroutines का combination concurrency को manage करने का powerful तरीका है। आप multiple goroutines को channels के जरिए communicate करवा सकते हैं।
Example: Goroutines Communicating via Channels
package main
import (
"fmt"
"time"
)
func worker(id int, ch chan int) {
for job := range ch {
fmt.Printf("Worker %d processing job %d\n", id, job)
time.Sleep(1 * time.Second) // Simulate processing time
}
}
func main() {
jobs := make(chan int, 5)
// Starting 3 worker goroutines
for i := 1; i <= 3; i++ {
go worker(i, jobs)
}
// Sending 5 jobs to workers
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs) // Close the jobs channel when all jobs are sent
// Wait to see workers complete their tasks
time.Sleep(5 * time.Second)
}
Explanation:
worker()
: यह function jobs को process करता है और हर job के बाद 1 सेकंड का wait करता है।- Multiple Goroutines: यहां हमने 3 workers बनाए हैं, जो एक साथ jobs को process कर रहे हैं।
Output: "Worker 1 processing job 1", "Worker 2 processing job 2", etc.
Summary
- Channels: Goroutines के बीच data को safely transfer करने के लिए उपयोग किए जाते हैं।
- Unbuffered Channels: Data send और receive करने पर दोनों goroutines block होते हैं।
- Buffered Channels: Multiple values को store कर सकते हैं, और जब buffer full हो जाता है, तब sending goroutine block होता है।
- Channel Closing: Channels को
close()
function से बंद किया जा सकता है। बंद channel से data receive किया जा सकता है लेकिन send नहीं किया जा सकता। - Select Statement: Multiple channels के साथ concurrent operations को handle करने के लिए
select
statement का उपयोग किया जाता है। - Goroutines and Channels: Channels और goroutines का combination concurrent और parallel processing को आसान बनाता है।
Channels Go में concurrency और synchronization के लिए एक powerful tool हैं। अगर आपको channels के बारे में और जानकारी चाहिए या कोई specific सवाल है, तो बताइए!
No comments:
Post a Comment