Golang の同時実行性とチャネル通信: 複数のチャネルから同時に読み取る
Golang の領域では、から読み取る必要がある場合があります。複数のチャンネルを同時に使用できます。この特定のクエリは、「any-to-one」チャネル設定の構築を中心にしています。2 つの go ルーチン (numgen1 と numgen2) が別々のチャネル (num1 と num2) に同時に数値を書き込み、3 回目の go でこれらの数値を集計することが目標です。 -routine (addnum).
次の点を考慮してください:
<code class="go">func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 done <- true }() n2 := <-num2 <-done sum <- (n1 + n2) }</code>
問題:
残念ながら、コード スニペット提供されたものに欠陥があります。これはポーリング メカニズムに依存しており、デッドロックが発生する傾向があります。
解決策:
この問題に対する確実な解決策には、select ステートメントを使用することが含まれます:
<code class="go">func main() { c1 := make(chan int) c2 := make(chan int) out := make(chan int) go func(in1, in2 <-chan int, out chan<- int) { for { select { case n1 := <-in1: out <- n1 case n2 := <-in2: out <- n2 } } }(c1, c2, out) }</code>
説明:
select ステートメントは、データがいずれかの入力チャネルに到着するまで事実上ブロックし、基本的に任意の 1 対 1 チャネルを作成します。データが利用可能になると、即座に出力チャネルを通じて送信されます。
このメソッドは、データが予測不可能な間隔でどちらかのチャネルに到着する可能性がある状況を適切に処理します。また、両方のソースからの入力を常に待機することにより、デッドロックのリスクも排除されます。
ゴルーチン関数の仮パラメータとして方向性チャネル型を利用することを忘れないでください。この実践により、コンパイラーが不適切なチャネルの使用を確実に防止できるようになり、コードの安全性が強化されます。
これらの洞察により、Golang での同時チャネル通信を自信を持って管理できるようになります。
以上がGo で複数のチャネルから同時に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。