「Go言語による並行処理」感想
「Go言語による並行処理」を献本いただいたので、早速読んだ。
tl;dr
- Goをある程度知ってる人向け(初級〜中級くらいのGoプログラマ?)
- あまり並行処理について深く学んだ事がないなら最適
- 並行処理の基本部分の説明が手厚くて良い
所感
本書の大きな 流れとしては
- 並行処理を記述する際の考え方(競合の発生、CSPの概念等)
- Goにおける並行処理プリミティブ(
go
キーワード、ロック・コンディション変数、channel
、select
等) - Goにおける並行処理パターン(書き方のテクニックからエラー処理等)
- Goランタイム上での並行処理の実装概要
という感じ。
並行処理の基本
最初の並行処理部分についてはいきなりコードをガンガン使うのではなく、概念等を含めかなりのボリュームと言葉で丁寧に説明してある。素晴らしい。
ただ、同時に「これは挫折する読者が一定数いるな」と思わせるくらいちゃんと書いてあるので、そういうのが苦手な人はちゃんとそういう本であることを知っておいたほうがいいと思う。
ここで挫折しそうな人は逆に言うと並行処理を必要としたことがないのかもしれない。
そうだったとしても、諦めずに一通り真面目に読んで「なんかデータの不整合とか不確定性がごにょごにょあるらしいぞ」というのを頭に入れておくと良いと思う。
本当に初めてその問題に当たった時に少なくとも「あ〜あれか!」と思い出せるし、その方が修正が早く終わるはず。
並行処理プリミティブ
プリミティブの紹介の中には sync.Mutex
や sync.Once
等の説明が書いてあるのだが、個人的にはちゃんと sync.Cond
について書いてあるのがポイント高い。
コンディション変数って意外と解説されてないことが多いと思う。なんだかどう言葉で説明しても、「ミューテックスだけで実現できないの?」に対する返答がしにくいと思うんですよね…
逆に、一旦自分で「安全な通知『だけ』が欲しい」と思ったら意義がわかるんだけど… とにかく、自分の説明↓よりかは遙かに良いと認めます!
並行処理パターン
本書のパターンの中にファンアウト・ファンインについての項目があって個人的には嬉しかったw ファンアウト・ファンインについては以前自分の連載(Web+DB Press vol 105)で書いたら「初めて聞いた」という声がわりとあって、えー、まじかーと思っていたのだ。ほら、わりとよくある話だったでしょ!
並行処理パターンは全体的に「著者の方は関数型プログラミングの出身なのかな(注:感想であって、なにも調べてないです)?」と思う感じのコードで、再帰を上手に使っているサンプルが多かった。
パイプラインは拙作の pecoでも使っているのだけど、正直 done
チャンネルで動的に構成されたパイプラインをキャンセルするとか悪夢なので、本の中で使うのはともかく、現実では素直に context.Context
を使うべきかなー。自分が作ったpipelineではパイプライン全体の終了を把握するために done
というチャンネルを持ってるけど、パイプラインを構成する各処理には context.Context
を渡している
総評
Go言語で本格的に並行処理をやろう!という人には良い本だと思う。
自分みたいにセオリーは実際に動かしながらじゃないとわからない人は並行処理プリミティブとパターンの部分を軽く読んでコードを動かしつつ最初の並行処理の概念部分をさらに読み込むとよいんじゃないだろうか。
初心者向けの難点としては、コードの解説文がどうしてもコード本体と離れるので、その部分を目で追うのが大変な事くらいだろうか。しかしこれはインタラクティブ性を持たないメディアではどうしようもないのでしょうがない。
すでに sync
パッケージを使いこなして、競合を発生させない書き方を理解している人にはあまり新しい要素はない。強いて言えばGoのランタイム内について解説してある部分が書籍にまとまっているのは良いと思う(とは言え、これも継続等の概念を知っている人なら新しい情報ではないと思う)
ということを鑑みると、Go言語をざっくり知っていて、とりあえず直線的なコードは書ける、という初級者・中級者向けに良い本だと思います!特に並行処理に使うツール群をまだよくわかってない方は必読!