Go公式WikiのMutex Or Channelの日本語意訳になります。
(元記事の最終更新日: 2015/03/20 rev.5)
チャネルを使うべきか、sync.Mutex
を使うべきかの解説になります。
Mutex Or Channel
sync.Mutexかチャネルかどちらを使う?
Goのモットーの1つに「通信によってメモリを共有すべし。メモリを共有することによって通信してはならない。」というものがあります。
とはいっても、、Goは伝統的なロック機構をsyncパッケージにて提供しています。多くのロックに関する問題はチャネルでも伝統的ロックのどちらでも解消可能です。
ではどちらを使うべきなのでしょうか?
より表現力豊かで、シンプルなものを使いましょう。
Go初心者のよくやる間違いは、単にチャネルとゴルーチンが使えるし、使うのが楽しいという理由で過度に使い過ぎてしまうことです。
[sync.Mutex](http://golang.org/pkg/sync/#Mutex)
が最も適している場合には、それを使うことを恐れないでください。
Goは問題解決に最も適したツールを使うことができ、1つのコードスタイルを強制しないことにおいて実用的な言語です。
しかし一般的な手引としては、以下のように使います。
チャネル | ミューテックス |
---|---|
データの所有権の譲渡、分散処理、非同期処理の結果の通信 | キャッシュ、ステート(状態) |
ウェイトグループ
同期処理に関する他の重要な基本要素として、sync.WaitGroup
があります。
これは協調したゴルーチンが別々に処理を進める前に、しきい値のイベントをまとめて待つことを可能にします。
これは典型的には2つの場合に有効です。
1つは「クリーンアップ」の時で、sync.WaitGroup
はメインを含む全てのゴルーチンを待ち、全てが正常に終了するのを確実にするために使われます。
2つ目はより一般的なケースで、しばらくの間別々に動作する一連のゴルーチンがあり、そして全てがsync.WaitGroupt
の阻害によって待機し、その後また別々に処理を続ける循環アルゴリズムです。このパターンは何度も繰り返されるかもしれません。
各データはその阻害イベントの時に交換することが可能です。この戦略はバルク同期並列(BSP)の基礎となっています。
チャネル通信、ミューテックス、そしてウェイトグループは相互に補完し合い、組み合わせることができます。
詳細情報
- Effective Goのチャネルの項: http://golang.org/doc/effective_go.html#channels
- syncパッケージ: http://golang.org/pkg/sync/