高性能並列処理を、Goの同期技術で実現する
Golangでは、次のような同時実行技術を利用して高性能並列処理を実現できます。
- Mutex:排他制御(Mutex)を使用して共有リソースへのアクセスを保護します。排他制御は同時に1つのゴルーチンだけが共有リソースにアクセスできるようにし、他のゴルーチンは排他制御が解放されるのを待機してからアクセスする必要があります。サンプルコードを以下に示します。
var mutex = sync.Mutex{}
var sharedResource = 0
func updateSharedResource() {
mutex.Lock()
sharedResource++
mutex.Unlock()
}
- WaitGroup:一連のgoroutineの完了を待つには、WaitGroupを使用します。WaitGroupは、一連のgoroutineがすべて完了してから、その後続の処理を継続するために使用されます。サンプルコードは次のとおりです。
var wg = sync.WaitGroup{}
func doSomeWork() {
wg.Add(1)
go func() {
defer wg.Done()
// 执行一些并发操作
}()
}
func main() {
// 执行一些并发操作
wg.Wait()
// 所有goroutine完成后继续执行
}
- Cond条件変数を使用して、goroutineの状態変化を待機または通知します。条件変数は、複数のgoroutine間で状態を同期するために使用されます。コードの例を次に示します。
var cond = sync.NewCond(&sync.Mutex{})
var condition = false
func waitForCondition() {
cond.L.Lock()
for !condition {
cond.Wait()
}
// condition为true,执行操作
cond.L.Unlock()
}
func signalCondition() {
cond.L.Lock()
condition = true
cond.Signal()
cond.L.Unlock()
}
- チャンネル:goroutine同士の通信と同期を行うためのチャンネルを利用する。チャンネルはデータの送受信や、goroutineの実行の同期に使用できる。
var done = make(chan bool)
func doSomeWork() {
// 执行一些并发操作
done <- true // 发送操作完成的信号
}
func main() {
go doSomeWork()
<-done // 等待操作完成的信号
// 继续执行
}
適切な同期テクニックを用途やニーズに合わせて選択することで、Go言語プログラムの並行性と信頼性を向上させられます。