parallelismとconcurrencyの違い
複数の処理が(少なくとも論理的に)同時に走っていて、処理やイベントが起きるタイミングが任意である、という場合に使います。分散処理の文脈で使われる場合が多いですが、必ずしも分散とは限りません。
https://www.youtube.com/watch?v=oV9rvDllKEg
Rob Pike氏によると、今日のプログラミング言語は、オブジェクト指向の考え方が主流だが、実際の世界は並列的であり、それを表現するのに適していない。 Rob Pike氏が開発に関わったGo言語は、並行性(concurrency)を備えた言語であり、並行性と並列性(parallelism)は異なる概念である。
Goファーを例に、並行性と並列性の違いを説明
最初は、1匹のGoファーが本の山から焼却炉へ本を運ぶ作業を行う。
次に、2匹のGoファーが同じ作業を行うが、効率は変わらない。そこで、Goファーにカートを与えることで、作業効率が上がる。ただし、Goファー同士の同期が必要になる。
Goファーとカートの数を倍にすると、同じ時間で2倍の本を運べるようになる。これは並列性を表している。
並行性は、問題をどのように分割するかに関係する。例えば、本を積む、カートを押す、焼却炉に本を入れる、という3つの作業を3匹のGoファーに分担させる。これにより、全体の効率が上がる。
さらに、空のカートを返すGoファーを追加することで、効率が上がる。これは、作業を細分化し、並行性を高めることで、全体のパフォーマンスが向上することを示している。
並行性を適切に設計することで、プログラムを並列に実行できる構造にすることができます。
Goファーの例で言えば、本を運ぶ作業を複数のGoファーに分担させることは並行性です。これにより、プログラムの構造が並列実行に適したものになります。そして、実際に複数のGoファーを同時に動かすことで、並列性を実現できます。
並行性を適切に設計することで、並列性を実現でき、パフォーマンスを向上させることができる。
Go言語では、goroutineとチャネルを使って並行性を実現する。goroutineは軽量のスレッドのようなもので、チャネルはgoroutine間の通信に使用される。
Go言語の並行性の仕組みを使って、ロードバランサーやレプリケーションされたデータベースの例を示し、並行性によって複雑な問題を簡潔に表現できることを説明。
並行性は強力だが、それ自体が並列性ではない。しかし、並行性によって並列性を実現することができ、並列性を容易にする。