本ページはプロモーション(PR)が含まれています
Pythonでわかる「並行処理」と「並列処理」の違いについて
「並列処理」と「並行処理」は日本語の場合、一文字違いで言葉も似ているため、混乱しがちです。ですが、ポイントを押さえると違いはシンプルで、Pythonの例と一緒に今回は整理しました。
並行処理と並列処理の違い
ふゅか
「並列処理」と「並行処理」って、名前が似すぎて毎回こんがらがるよね!
はるか
一文字違い。中身は別。
並行処理(concurrency)
並行処理は、複数の処理が同時に進んでいるように見せる仕組みです。
たとえばCPUのコアが1つでも、処理Aと処理Bを短い時間ごとに切り替えながら進めれば、
外から見ると「同時に動いている」ように見えます。
重要なのは、並行処理の目的が「待ち時間を有効活用すること」にある点です。
- 待ち時間が長い処理に向いている
- 例:Web APIアクセス、DBアクセス、ファイル読み書きなど
- いわゆるI/Oバウンドな処理で効果が出やすい
並列処理(parallelism)
並列処理は、複数の処理を本当に同時に実行する仕組みです。
CPUのコアが複数ある環境で、処理Aをコア1、処理Bをコア2のように割り当てることで、
同じタイミングで処理が進みます。
並列処理の目的は、重い計算を分担して速く終わらせることです。
- CPUに負荷がかかる処理に向いている
- 例:画像処理、動画変換、大量データの集計、シミュレーションなど
- いわゆるCPUバウンドな処理で効果が出やすい
並行処理(asyncio)
まずは並行処理をasyncioで実装してみましょう。
import asyncio
async def task(name, delay):
print(f"{name} 開始")
await asyncio.sleep(delay) # 待っている間に他のタスクへ切り替え可能
print(f"{name} 終了")
async def main():
# 複数のタスクを並行して実行
await asyncio.gather(
task("タスク1", 2),
task("タスク2", 1),
task("タスク3", 3)
)
if __name__ == "__main__":
asyncio.run(main())
このコードは、3つのタスクを「同時に進めているように」見せる例です。
ポイントは await asyncio.sleep() の部分で、ここで待っている間に別のタスクへ処理が切り替わります。
そのため、タスクマネージャーで確認しても、Pythonは1つのプロセスしか立ち上がらないことを確認できます。
並列処理(multiprocessing)
次に並列処理をmultiprocessingで実装してみましょう。
import multiprocessing
import time
def task(name, delay):
print(f"{name} 開始")
time.sleep(delay) # 例としてスリープ(実際は計算処理を想定)
print(f"{name} 終了")
if __name__ == "__main__":
# 複数のプロセスを並列に実行
processes = [
multiprocessing.Process(target=task, args=("タスク1", 2)),
multiprocessing.Process(target=task, args=("タスク2", 1)),
multiprocessing.Process(target=task, args=("タスク3", 3)),
]
for p in processes:
p.start()
for p in processes:
p.join()
このコードは、タスクを別プロセスとして起動します。
そのため、タスクマネージャーでPythonを確認すると、複数のプロセスが立ち上がることが分かります。
実行結果(表示の順序)が並列処理と同じですが、内部では「1プロセスで切り替え」ではなく、複数プロセスで同時進行している点が大きく異なります。
