Home >Backend Development >Golang >How to Efficiently Read Data from Multiple Channels Concurrently in Golang?
Asynchronous Reading from Multiple Channels in Golang
In Go, Goroutines play a crucial role in parallel programming. Often, it becomes necessary to read data from multiple channels concurrently to achieve optimal performance.
Consider the following scenario: Goroutines numgen1 and numgen2 concurrently write numbers to channels num1 and num2, respectively. Your task is to create a new Goroutine, addnum, that reads from these channels, adding their values and writing the result to a new channel, sum.
Initially, you might attempt a solution like this:
func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 // Read from channel done <- true // Signal completion }() n2 := <-num2 // Read from channel <-done // Wait for completion sum <- n1 + n2 // Write to destination channel }
However, this approach is flawed because it doesn't guarantee simultaneous reading from both channels.
Solution: Using select
A more efficient solution involves using Go's select keyword, which allows you to perform non-blocking reads from multiple channels:
func addnum(num1, num2 <-chan int, sum chan<- int) { for { select { case n1 := <-num1: select { case n2 := <-num2: sum <- n1 + n2 default: // Store value back in channel num1 <- n1 } case n2 := <-num2: select { case n1 := <-num1: sum <- n1 + n2 default: // Store value back in channel num2 <- n2 } } } }
In this code, the for loop runs indefinitely, continuously listening for data on either num1 or num2. When data is received on one channel, the inner select attempts to read from the other channel. If successful, the values are added and sent to the sum channel.
Note:
The above is the detailed content of How to Efficiently Read Data from Multiple Channels Concurrently in Golang?. For more information, please follow other related articles on the PHP Chinese website!