並行と並列のちがい
日本語では似て見えるが(並行=concurrency/並列=parallelism)、指すものが違う。並行は「構造」の話であり、多数のタスクを、時間を重ねながら切り替えて進める設計を指す。並列は「実行」の話であり、複数のタスクを本当に同時に走らせることを指し、複数の働き手(CPUコア=プロセッサの処理単位)が必要になる。Rob Pike(=Go言語の設計者の一人)の言葉を借りれば「並行とは多くを“さばく”こと、並列とは多くを“同時に行う”こと」である。
並行(concurrency)=構造
並行とは、多数のタスクが、重なり合う時間の中で進むように設計することであり、必ずしも同一瞬間に処理されるとは限らない。働き手が1人でも並行は成立する。タスクAを始め、Aが待ちの間にBへ切り替え、またAへ戻る──この交互処理(インターリーブ)がその実体である。CPUコアが1つでも、タイムスライス(=ごく短時間で処理対象を切り替える方式)によって実現でき、2人目の働き手は不要である。並行は「独立したタスクをどう組み立てるか」という設計の話であり、速度そのものの話ではない。
並列(parallelism)=同時実行
並列とは、複数のタスクを文字どおり同一瞬間に実行することである。これには複数の実行単位が必要で、CPUコアが2つ以上あるか、複数台のマシンが要る。CPUを多く使う処理において、実時間(=時計で測った実際の所要時間)を実際に短くするのはこの並列である。並列は「並行という設計を速く走らせる一つの手段」にすぎず、並行という設計があってはじめて並列が活きる。
カフェのたとえ(補足として)
並行の例は、1人のバリスタが注文を受け、マシンを回し、抽出を待つ間に次の注文を受ける、というやりくりである。並列の例は、2人のバリスタが同じ瞬間にそれぞれ1杯ずつ作る、という本当の同時性である。したがって並行は並列なしでも成立し(1人のバリスタのやりくり)、並列には働き手が2人以上必要になる。Claude Code(=Anthropic製のAIコーディング支援ツール)のワークフローで言えば、parallel() は多数のエージェントを並行に列へ並べるが、真の並列実行は(CPUコア数−2)が上限であり、残りは順番待ちになる。
まとめ
並行は「構造」(多数のタスクを切り替えてさばく設計)であり、並列は「実行」(同一瞬間に走らせること・複数コアが必要)である。1コアは並行にはなれるが、決して並列にはなれない。
出典・参考
- Rob Pike — Concurrency Is Not Parallelism(講演) — 公式ブログ(Go言語)
- MDN — Threads and concurrency(概説) — 技術文書