Concurrency in Go Chapter2(1)
“Concurrency in Go: Tools and Techniques for Developers”の2章 “Modeling Your Code: Communicationg Sequential Processes”の読書メモと補足 。
※ ”concurrent”は「並行」、”parallel”は「並列」と訳されることが多いと思うが、訳しても似すぎていてややこしいのでそのままの表記にする。
ConcurrencyとParallelismの違い
Concurrencyはコードの特性であり、Parallelismはプログラムのランタイムの特性である。Parallelismは同一時間に実行されることを指す。プログラムがParallelに動くかどうかは実行環境に依存している。(コードだけを見てもParallelに実行されるプログラムだと判断できない)シングルコアの環境でConcurrentなコードを実行したとしても、Parallelに動かず、逐次的に動くということである。
Concurrencyの例
タスク1とタスク2が存在するとする。Aさんがタスク1を10分実行し、その後タスク2を10分実行し、またその後タスク1を10分実行するなどのように、1人が複数のタスクを切り替えていく場合、タスクがConcurrentに実行されたと言える。
Parallelismの例
AさんとBさん、タスク1とタスク2が存在するとする。Aさんがタスク1を、Bさんがタスク2を同時に実行する場合、タスクがParallelに実行されたと言える。
補足
- Rob Pike — ‘Concurrency Is Not Parallelism’
Rob Pikeさんの有名な動画。
- Rebuild: 158: Kill All The Threads (ko1, Matz)
まつもとゆきひろさんと笹田耕一さんの回。Rubyで今後実装されるGuildの説明をする際に、ConcurrencyとParallelismに関する話があった。