Go高性能Selectチャネルを利用した並行プログラミング
Go言語では、非同期の効率的な実装にselect文を使用でき、複数のチャネルで非ブロッキング選択を実現できます。
select文による並行プログラミングの例を以下に示します。
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan int)
ch2 := make(chan int)
go func() {
time.Sleep(2 * time.Second)
ch1 <- 1
}()
go func() {
time.Sleep(1 * time.Second)
ch2 <- 2
}()
select {
case <-ch1:
fmt.Println("Received from ch1")
case <-ch2:
fmt.Println("Received from ch2")
}
fmt.Println("Done")
}
上記のコードでは、2つのチャネルch1とch2を作成したあと、2つのgoroutineを実行して、個別に2つのチャネルにデータを送信します。select文を使用すると、複数のチャネルを同時に監視でき、任意のチャネルに受信可能なデータがあると、select文は対応するケースのコードブロックを実行し、他のケースは無視されます。この例では、ch2のデータのみが先に到着するため、ch2のケースが実行されます。
読み込み可能なデータが複数のチャネルにある場合、select ステートメントはランダムに 1 つのケースを実行するように選択します。読み込み可能なデータがチャネルにない場合、select ステートメントは、データが読み込み可能になるまでブロックします。
select文を使用することで、複数のチャネルの同時処理を効率良く行えて、従来の条件変数などの方法では起きてしまうブロックを回避できる。これにより、CPUリソースをより効果的に活用でき、プログラムの並列性能を向上できる。