Goのロック機構を活用して高パフォーマンスな同時処理を実現する
Goにおけるロック機構はsyncパッケージを通して主に実装されます。syncパッケージは、MutexやRWMutexなどの様々なロック型を提供します。
排他制御を使用して高性能な並列処理を実施する例を以下に示します
package main
import (
"fmt"
"sync"
"time"
)
type Data struct {
value int
lock sync.Mutex
}
func main() {
data := Data{}
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
data.setValue(i)
}(i)
}
wg.Wait()
fmt.Println(data.getValue())
}
func (d *Data) setValue(value int) {
d.lock.Lock()
defer d.lock.Unlock()
time.Sleep(time.Millisecond) // 模拟耗时操作
d.value += value
}
func (d *Data) getValue() int {
d.lock.Lock()
defer d.lock.Unlock()
return d.value
}
このサンプルでは`Data`構造体は共有データを表し、その`lock`フィールドは排他ロックオブジェクトである。`setValue`メソッドと`getValue`メソッドはそれぞれ`value`フィールドに対して排他ロックを使用して保護された書き込みと読み込みを行う。
メイン関数では、WaitGroupを利用して、すべてのgoroutineが完了するまで待機します。各goroutineは、setValueメソッドを呼び出して、自身の値をDataのvalurフィールドに加算します。
排他制御を使うことで、共有データへの同時実行時の安全なアクセスが確保されます。