Go言語における並列処理について
並列処理の設計はCSPに由来している。 goroutine と channel によって、効率良く並列処理を記述できる。
http://golang.jp/effective_go#concurrencyより。
Go言語では、
- 共有変数をチャネル上で引き回し、
- 実行中の異なるスレッドからは実際に同時アクセスさせない
という今までとは異なる手法を推奨しています。
あるタイミングで値にアクセスできるゴルーチンはひとつだけなので、設計上データ競合は起きえません。
共有メモリを使った通信は行わず、代わりに通信を使うことでメモリを共有するようにしてください。このモデルについて考える手立てとして、
- 1台のCPU上で動いている典型的なシングルスレッドプログラムがあると仮定します。
- これには同期プリミティブは不要です。
- 同様に同期が不要であるインスタンスを新しく起動して、
- これらスレッド間を通信させます。
- この通信が同期していれば、それ以外の同期はとりあえず必要ありません。
整理すると、
- 複数起動した goroutine をそれぞれ独立したスレッドと見立てる
- それぞれの goroutine の中では同期プリミティブは不要
- 異なる goroutine の間で通信を行う場合、この
通信が同期していれば
それ以外の同期は必要ない - Go言語では channel が goroutine 間の
通信の同期
を保証している - だから、goroutine 間の通信には channel を使うことを推奨する
ということ。
0 件のコメント:
コメントを投稿