この記事では、Go言語の並行処理について記載します。
Go言語は、複数のタスクを同時に実行するための強力な機能を持っています。
その実現には、ゴルーチン(Goroutines)とチャネル(Channels)という2つの主要な概念がキーとなります。
ゴルーチンについて
ゴルーチンは、軽量なスレッドのようなもので、Goランタイムによって管理されます。ゴルーチンは非常に少ないメモリ(数KB)を使用し、必要に応じて成長・縮小します。これにより、数千から数百万のゴルーチンを同時に実行することが可能となります。
新しいゴルーチンは、go
キーワードと関数呼び出しを組み合わせることで作成されます。
go doSomething()
上記のコードは、新しいゴルーチンを作成し、その中でdoSomething
関数を非同期に実行します。
チャネルについて
チャネルは、ゴルーチン間での通信と同期を可能にするデータ構造です。一つのゴルーチンはチャネルにデータを送信し、別のゴルーチンはそのチャネルからデータを受信することができます。
チャネルは、make
関数とチャネル型を使用して作成されます。
ch := make(chan int)
上記のコードは、整数を送受信するための新しいチャネルを作成します。
チャネルにデータを送信するには、送信演算子<-
を使用します。
ch <- 10
上記のコードは、チャネルch
に整数10
を送信します。
チャネルからデータを受信するには、同じ送信演算子を使用しますが、この場合は左辺に変数を置きます。
x := <-ch
上記のコードは、チャネルch
からデータを受信し、それを変数x
に代入します。
ゴルーチンとチャネルの組み合わせ
ゴルーチンとチャネルは、一緒に使うことで最も強力になります。ゴルーチンは計算の並列化を可能にし、チャネルはその並列計算の結果を合成するための安全な方法を提供します。
以下に、ゴルーチンとチャネルを使用して、2つの関数を並列に実行し、その結果を合成する例を示します。
func main() {
ch := make(chan int)
go func() {
ch <- doSomething()
}()
go func() {
ch <- doSomethingElse()
}()
result1 := <-ch
result2 := <-ch
fmt.Println("Combined result:", result1 + result2)
}
上記のコードは、2つのゴルーチンを作成し、それぞれで異なる関数を実行します。各関数の結果はチャネルに送信され、メインゴルーチンではそれらの結果を受信し、合成します。