Golang で複数のチャネルを同時に読み取る
Golang で同時実行を使用する場合、タスクは多くの場合、チャネルを介して通信する複数のゴルーチンに分割されます。複数のゴルーチンが 1 人の受信者によって消費される値を生成する状況では、複数のソースから同時にデータを収集するチャネルが必要になります。この記事では、Go でそのような「any-to-one」チャネルを構築するための効率的なアプローチを検討することで、この要件に対処します。
課題を理解する
2 つのゴルーチン numgen1 について考えてみましょう。および numgen2 は、それぞれ別のチャネル num1 と num2 に数値を書き込みます。目標は、これらのチャネルから受信した数値を合計する新しいプロセス addnum を作成することです。
提案されたソリューション
最初の試行には、個別の受信操作の使用が含まれる場合があります。単一のゴルーチン内の両方のチャネルで実行します:
func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 done <- true }() n2 := <-num2 <-done sum <- n1 + n2 }
ただし、このアプローチには根本的な問題があります。一度に 1 つのチャネルからのみ読み取り、次のチャネルに進む前に各値を待機します。
より効率的なアプローチ
複数のチャネルからの同時読み取りを可能にするには、select ステートメントを使用できます。この構造により、ゴルーチンが複数のチャネルで同時に操作を待機できるようになります。
func main() { c1 := make(chan int) c2 := make(chan int) out := make(chan int) go func(in1, in2 <-chan int, out chan<- int) { for { sum := 0 select { case sum = <-in1: sum += <-in2 case sum = <-in2: sum += <-in1 } out <- sum } }(c1, c2, out) }
この例では、select ステートメントは c1 または c2 のデータを継続的に待機します。 1 つのチャネルから値を受信すると、合計が加算され、out チャネルに出力されます。
結論
select ステートメントを使用すると、 Golang では「any-to-one」チャネルを作成して、複数のゴルーチンが単一のチャネルに同時に書き込むことができます。このアプローチにより、複雑な同時システムでの効率的な通信とデータ集約が可能になります。
以上がGolang で複数のチャネルを同時に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。