Golang での複数のチャネルからの非同期読み取り
Go では、ゴルーチンは並列プログラミングで重要な役割を果たします。多くの場合、最適なパフォーマンスを達成するには、複数のチャネルから同時にデータを読み取る必要があります。
次のシナリオを考えてみましょう: ゴルーチン numgen1 と numgen2 が、それぞれチャネル num1 と num2 に同時に数値を書き込みます。あなたのタスクは、これらのチャネルから読み取り、値を追加して結果を新しいチャネル sum に書き込む新しいゴルーチン addnum を作成することです。
最初は、次のような解決策を試みるかもしれません。
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 のいずれかのデータを継続的にリッスンします。 1 つのチャネルでデータが受信されると、内部選択は他のチャネルから読み取ろうとします。成功すると、値が追加されて合計チャネルに送信されます。
注:
以上がGolang で複数のチャネルから同時にデータを効率的に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。