Go言語100Tips ありがちなミスを把握し、実装を最適化する の No.55を読んだ。ここから第8章 並行処理: 基本編
これから並行処理のTipsに入る。その前に、よく間違われる「並行処理」と「並列処理」の違いについて説明されているのが No.55で、これはGo言語に限った話ではない。
この、並行と並列の説明は、いろんな方がいろんな例を用いて説明しているのを見るが、どれを何度聞いてもはっきりしないことが多い。と、いうもの、説明が悪いということではなく、そもそもそのコンピュータがどのように処理を行っているかを知っていないと、ここは理解できないと思う。
この説では、コーヒーショップで客が注文してからコーヒーが提供されるまでの仕事を例にして説明されていた。これはなるほど!わかりやすい説明だなと思った。
全く並行も並列もされていない場合:一人の店員が一つのマシンを使って全てを順番にこなしていくやり方。この場合、この店員はいわゆる「バリスタ」というやつだろうか。ただし、全て逐次で仕事をやっていくタイプの人。
単純に並列化する場合:上記のバリスタ店員とコーヒーマシンのセットをもう一セット用意する。これは完全な並列化(parallel)だ。
並行処理で効率化する場合:一連の仕事をいくつかに分割する。例えば、注文を受ける、豆を挽く、コーヒーを淹れる、など。この中で同時に行っても問題ないものを同時に行う。これは並行(concurrency)。
とはいえ、この場合、コーヒーマシンを使う時間がかかるため、注文をたくさん受けた場合に、豆を挽く部分で競合が発生する。コーヒーマシン空き待ちだ。そこで、コーヒーマシンを複数台導入し、コーヒーマシンで行う仕事を同時に行うことで効率化する。つまり、並行に行える構造にしたことで、全ての作業を複製することなく、分的な並列処理で効率化することが可能になった。
まあ、でもこれは、やっぱり、わかっている人にしかわからない説明な気がするなあ。