Go Wiki: sync.Mutex とチャネルのどちらを使うべきか?

Goのモットーの一つは「メモリを共有するのではなく、通信によってメモリを共有する」です。

とは言え、Goはsyncパッケージで伝統的なロック機構を提供しています。ほとんどのロックに関する問題は、チャネルまたは従来のロックのどちらかを使用して解決できます。

では、どちらを使用すべきでしょうか?

最も表現力豊かで、最も単純な方を使用してください。

Go初心者がよく犯す間違いは、可能だから、あるいは楽しいからという理由だけでチャネルとゴルーチンを使いすぎることです。問題に最も適している場合は、sync.Mutexの使用を恐れないでください。Goは、問題解決に最適なツールを使用できるようにすることで実用的であり、単一のコードスタイルを強制することはありません。

ただし、一般的なガイドとしては

チャネルMutex
データの所有権を渡す,
作業単位を分散する,
非同期の結果を通信する
キャッシュ,
状態

sync.Mutexのロック規則が複雑になりすぎていると感じたら、チャネルを使用する方が簡単かどうかを自問してください。

Wait Group

もう一つの重要な同期プリミティブはsync.WaitGroupです。これらにより、協調するゴルーチンが、再び独立して続行する前に、しきい値イベントをまとめて待機することができます。これは、通常、2つのケースで役立ちます。

1つ目は、「クリーンアップ」時で、sync.WaitGroupを使用して、メインのゴルーチンを含むすべてのゴルーチンが、すべてが完全に終了する前に待機するようにすることができます。

2つ目のより一般的なケースは、しばらく独立して作業するゴルーチンのセットが含まれる循環アルゴリズムで、すべてがバリアで待機してから、再び独立して続行します。このパターンは何度も繰り返される可能性があります。データはバリアイベントで交換される場合があります。この戦略は、バルク同期並列処理(BSP)の基礎です。

チャネル通信、ミューテックス、ウェイトグループは補完的であり、組み合わせることができます。

詳細情報


このコンテンツはGo Wikiの一部です。