Golang 中多通道非同步讀取
Go 中,Goroutines 在平行程式設計中起著至關重要的作用。通常,需要同時從多個通道讀取資料才能獲得最佳效能。
考慮以下情境:Goroutine numgen1 和 numgen2 分別同時向通道 num1 和 num2 寫入數字。您的任務是建立一個新的 Goroutine addnum,它從這些通道中讀取數據,添加它們的值並將結果寫入新的通道 sum。
最初,您可以嘗試這樣的解決方案:
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 }
但是,這種方法是有缺陷的,因為它不能保證兩個通道同時讀取。
解決方案:使用select
更有效率的解決方案是使用Go 的select 關鍵字,它允許您從多個通道執行非阻塞讀取:
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 } } } }
在此程式碼中,for 迴圈無限期運行,持續偵聽num1 或num2 上的資料。當一個通道上接收到資料時,內部選擇會嘗試從另一個通道讀取資料。如果成功,這些值將被加到並傳送到總和通道。
注意:
以上是Golang中如何有效率並發讀取多通道資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!