Goでセレクトチャネルを使用して同時実行を行う方法

Goにおいて、select文を利用することで複数のチャネルの操作を待ち受け、最初に準備できたチャネルの処理を行うことができる。以下に、select文を使用した並行処理の実装例を示す。

package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
time.Sleep(2 * time.Second)
ch1 <- "Hello"
}()
go func() {
time.Sleep(1 * time.Second)
ch2 <- "World"
}()
for i := 0; i < 2; i++ {
select {
case msg1 := <-ch1:
fmt.Println("Received from channel 1:", msg1)
case msg2 := <-ch2:
fmt.Println("Received from channel 2:", msg2)
}
}
}

上記サンプルでは、2つのチャネルch1とch2を作成しています。その後、2つのgoroutineにおいて、それらのチャネルにデータを送信しています。goroutineは、時間のかかる処理をシミュレートするために、データを送信する前にしばらく待機します。

メイン関数では、select文で2つのチャネルの操作を待ち受けます。いずれかのチャネルで読み込み可能なデータがある場合、select文は準備完了した最初のチャネルを選択して処理を行います。その後、受信したデータをプリントします。

最後にselect文をループさせて2つのgoroutineから届くデータを確実に受信できるようにしています。

上記コードを実行すると、下記のような出力が表示されます。

Received from channel 2: World
Received from channel 1: Hello

同時に2つのチャンネルからselect文を使ってデータを非同期に受け取ることができた。

bannerAds