Go言語で高い並列処理を実現する方法
Goはゴルーチンとチャンネルで同時並行性を実現します。
軽量スレッドのGoroutineはGolangに備わり、複数のGoroutineを同時に実行でき、しかも切り替えにかかるオーバーヘッドが小さい。新しいGoroutineは、キーワードgoを使って作成できる。例:
go func() {
// 这里是并发执行的代码
}()
GoのGoroutine間の通信と同期を行うためのパイプがチャネルです。チャネルではGoroutine間で値の受け渡しができます。チャネルは非同期セーフなブロック送信・受信の仕組みを提供しています。例えば:
ch := make(chan int) // 创建一个整数类型的Channel
go func() {
ch <- 42 // 向Channel发送数据
}()
result := <-ch // 从Channel接收数据
Goルーチンとチャネルを使うことで、高並行性プログラムを実現できます。並行実行するタスクをGoルーチンにカプセル化し、チャネルを介してデータの受け渡しや同期を行います。また、適切な並行制御メカニズム(WaitGroupやMutexなど)を使用することで、並行実行されるGoルーチンをより効果的に管理できます。
Goroutine と Channel を使った高並列カウンターの一例を以下に示します。
package main
import (
"fmt"
"sync"
)
func main() {
counter := make(chan int)
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
counter <- 1
wg.Done()
}()
}
go func() {
wg.Wait()
close(counter)
}()
sum := 0
for n := range counter {
sum += n
}
fmt.Println(sum)
}
チャネルを100個生成し、カウンターとして使用します。100個のゴルーチンからカウンターに数字1を送信し、WaitGroupで同期を行います。最後に、カウンターから受け取った数値を循環的に加算してsumにします。最終的な出力結果は100になります。