【比較】並行(concurrency)と並列(parallelism)の違い¶
概要¶
「並行(concurrency)」と「並列(parallelism)」は、複数の処理を同時に進めることに関わる概念ですが、指している対象が異なります。並行は「複数の独立した処理をどう構造化して扱うか」というソフトウェアの設計上の性質であり、並列は「複数の計算を物理的に同時実行する」という実行上の性質です。
日本語では両方「同時」と訳しがちで、英語の concurrency/parallelism も日常語として近いため混同が頻発します。この区別を最も明快に示したのが Rob Pike の講演「Concurrency is not parallelism」で、本記事はその公式な定義に沿って整理します。要点は「並行=たくさんのことをさばく(dealing with)こと、並列=たくさんのことを同時にやる(doing)こと」です。
詳細比較¶
| 項目 | 並行 (Concurrency) | 並列 (Parallelism) |
|---|---|---|
| 本質 | 独立に実行できる処理の構成・構造化(dealing with lots of things at once) | 計算の同時実行(doing lots of things at once) |
| 層 | プログラム設計・構造の問題 | ハードウェア/実行の問題 |
| 必要なハードウェア | シングルコアでも成立する(時分割で切り替え) | 物理的に複数の実行資源(マルチコア/複数マシン)が必要 |
| 目的 | 良い構造でタスクを分解・協調させること | スループット向上・実行時間短縮 |
| 関係 | 並列実行を可能にする「構造」を与える。ただし並列は並行の目的ではない | 並行に設計されたものを、資源があれば同時実行する形 |
| 代表例 | goroutine とチャネル、async/await、イベントループ、アクターモデル | マルチコアでの SIMD・データ並列、GPU 演算、複数ノードでの分散計算 |
Go 公式ブログ(Andrew Gerrand, 2013-01-16)は、より形式的に「並行=独立に実行されるプロセスの構成(composition)」「並列=(関連し得る)計算の同時実行(simultaneous execution)」と定義しています。並行な設計は並列を「可能にする」構造を与えますが、並列は並行の目的ではなく、並行の目的は良い構造そのものです。
よくある誤解¶
-
「並行=並列」は誤り。 シングルコア CPU でも並行は成立します。OS がタスクを高速に切り替える(時分割)ことで「複数のことをさばいて」いますが、ある瞬間に実際に動いている計算は1つだけなので並列ではありません。並行は構造、並列は実行であり層が違います。
-
「並行に書けば自動的に速くなる(並列化される)」は誤り。 並行は並列を可能にする構造を与えるだけで、それ自体が速度を保証しません。実行資源(コア数)が1つなら、いくら並行に分解しても同時実行はされません。逆に I/O 待ちが多い処理では、並列がなくても並行(待ち時間に別タスクを進める)だけで応答性とスループットが大きく改善します。
-
「並列にはマルチスレッドが必須」は誤り。 並列はマルチプロセス、SIMD 命令、GPU、複数マシンへの分散など、スレッド以外でも実現できます。並列の本質は「複数の実行資源での同時計算」であり、特定の実装手段に縛られません。
実務での選び分け¶
- I/O 待ち(ネットワーク・ディスク・DB)が支配的 → まず並行設計(async/await、イベントループ、軽量タスク)で応答性とスループットを上げる。多くの場合、これだけで十分。
- CPU バウンドで計算自体を速くしたい → 並列実行(マルチコアへの分割、データ並列、GPU、分散)を導入する。並行に分解した上で実行資源を割り当てる。
- まず構造、次に速度 → 問題を「独立に進められる単位」へ並行分解しておくと、後からコアを増やすだけで並列化できる。最初から並列実装に固めると保守性を損ないやすい。
- 正しさの担保 → 並行・並列いずれも共有状態があれば競合が起きる。チャネル/メッセージパッシング/不変データで共有を最小化する。
ひとことまとめ¶
並行は「複数の処理をどう構造化してさばくか」という設計の性質、並列は「複数の計算を同時に実行する」という実行の性質であり、並行は並列を可能にする土台だが並列は並行の目的ではありません。
出典・参考¶
- Concurrency is not parallelism — The Go Programming Language(Andrew Gerrand, 2013-01-16) — Rob Pike の講演を紹介する Go 公式ブログ記事(背景・文脈)
- Concurrency is not Parallelism — Rob Pike 講演スライド(Waza 2012) — 原典の講演スライド。定義「dealing with vs doing」「composition vs simultaneous execution」の出どころ