Go Wiki: sync.Mutex とチャネルのどちらを使うべきか?
Goのモットーの一つは「メモリを共有するのではなく、通信によってメモリを共有する」です。
とは言え、Goはsyncパッケージで伝統的なロック機構を提供しています。ほとんどのロックに関する問題は、チャネルまたは従来のロックのどちらかを使用して解決できます。
では、どちらを使用すべきでしょうか?
最も表現力豊かで、最も単純な方を使用してください。
Go初心者がよく犯す間違いは、可能だから、あるいは楽しいからという理由だけでチャネルとゴルーチンを使いすぎることです。問題に最も適している場合は、sync.Mutex
の使用を恐れないでください。Goは、問題解決に最適なツールを使用できるようにすることで実用的であり、単一のコードスタイルを強制することはありません。
ただし、一般的なガイドとしては
チャネル | Mutex |
---|---|
データの所有権を渡す, 作業単位を分散する, 非同期の結果を通信する | キャッシュ, 状態 |
sync.Mutexのロック規則が複雑になりすぎていると感じたら、チャネルを使用する方が簡単かどうかを自問してください。
Wait Group
もう一つの重要な同期プリミティブはsync.WaitGroupです。これらにより、協調するゴルーチンが、再び独立して続行する前に、しきい値イベントをまとめて待機することができます。これは、通常、2つのケースで役立ちます。
1つ目は、「クリーンアップ」時で、sync.WaitGroupを使用して、メインのゴルーチンを含むすべてのゴルーチンが、すべてが完全に終了する前に待機するようにすることができます。
2つ目のより一般的なケースは、しばらく独立して作業するゴルーチンのセットが含まれる循環アルゴリズムで、すべてがバリアで待機してから、再び独立して続行します。このパターンは何度も繰り返される可能性があります。データはバリアイベントで交換される場合があります。この戦略は、バルク同期並列処理(BSP)の基礎です。
チャネル通信、ミューテックス、ウェイトグループは補完的であり、組み合わせることができます。
詳細情報
- Effective Goのチャネル: https://go.dokyumento.jp/doc/effective_go#channels
- syncパッケージ: https://pkg.go.dev/sync/
このコンテンツはGo Wikiの一部です。