「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Golang で複数のチャネルからの同時読み取りを実現するにはどうすればよいですか?

Golang で複数のチャネルからの同時読み取りを実現するにはどうすればよいですか?

2024 年 11 月 24 日に公開
ブラウズ:420

How Can You Achieve Concurrent Reading from Multiple Channels in Golang?

Golang での複数のチャネルからの同時読み取り

Golang では、「任意の対 1」チャネルを作成できます。複数のゴルーチンが同じチャネルに同時に書き込むことができます。この機能を実現する方法を見てみましょう。

1 つの方法は、select ステートメントを使用することです。これにより、複数のチャネルがデータを受信するのを待つことができます。

func main() {
  // Create input channels
  c1 := make(chan int)
  c2 := make(chan int)
  // Create output channel
  out := make(chan int)

  // Start a goroutine that reads from both input channels and sums the received values
  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)
}

このゴルーチンは無限に実行され、両方のチャネルから読み取り、受信した値の合計を出力チャネルに送信します。ゴルーチンを終了するには、両方の入力チャネルを閉じる必要があります。

別のアプローチとして、次のコードを使用することもできます。

func addnum(num1, num2, sum chan int) {
  done := make(chan bool)

  go func() {
    n1 := <-num1
    done <- true        // Signal completion of one channel read
  }()

  n2 := <-num2             // Read from the other channel
  <-done                   // Wait for the first read to complete

  sum <- n1   n2
}

この関数は、別の「完了」チャネルを使用して、1 つのチャネルが正常に読み取られたことを通知します。ただし、このアプローチは、入力チャネルに書き込むゴルーチンを変更する必要があるため、柔軟性に欠ける可能性があります。

適切なアプローチは、アプリケーションの特定の要件によって異なります。どの方法を選択しても、Golang の同時実行機能は、複数のチャネルを同時に処理するための強力なツールを提供します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3