同期処理と非同期処理とは?初心者向けにわかりやすく解説

プログラムを書いていると、「同期処理」と「非同期処理」という言葉に出会うことがあります。

「なんだか難しそう…」
「結局、どう違うの?」

そんな初心者の方に向けて、わかりやすい例や図解で解説していきます!

1. 同期処理とは?

同期処理は、1つの処理が終わるまで次の処理を待つ動きのことです。

特徴

  • 順番通りに実行される
  • 待ち時間が発生する
  • 分かりやすいが、時間がかかることも

2. 非同期処理とは?

非同期処理は、待たずに次の処理を進められる動きのことです。

特徴

  • 処理が同時進行できる(裏で進められる)
  • 時間を効率的に使える
  • 少し仕組みは複雑

3. 違いを簡単に比較

比較項目同期処理非同期処理
実行の順序順番通り待たずに次へ進む
待ち時間の扱い待つ必要がある別の作業を並行できる
わかりやすさ簡単・直感的少し理解が必要
使いどころ単純な処理向き時間のかかる処理に向いてる

4. 日常生活の例で理解しよう

同期処理の例:

  1. トースターでパンを焼く
  2. 焼き上がるまでじっと待つ
  3. 焼けたら、コーヒーを淹れる

パンが焼け終わるまで、何もできない状態。

非同期処理の例:

  1. トースターでパンを焼き始める
  2. その間にコーヒーを淹れる
  3. 両方が終わったら一緒に食べる

時間を無駄にせず、同時進行できる状態!

5. プログラム上のイメージ

同期処理のPythonコード例:

import time

def task1():
time.sleep(2) # 2秒待つ(ここが「待ち」の部分)
print("Task 1 完了")

def task2():
print("Task 2 完了")

task1()
task2()

解説:

  • task1() では time.sleep(2) によって2秒間待機します。
  • その間、task2() は実行されません。
  • つまり、「2秒間止まってから次の処理に進む」=同期処理です。

非同期処理のPythonコード例:

import asyncio

async def task1():
await asyncio.sleep(2)
print("Task 1 完了")

async def task2():
print("Task 2 完了")

async def main():
await asyncio.gather(task1(), task2())

asyncio.run(main())

解説:

1. async def と await の意味

  • async def は「非同期関数」であることを示します。普通の def とは異なり、内部で待ち時間が発生しても他の処理に切り替えられる特別な関数です。
  • await は「ここで何かを待っている間、他の処理を進めてOKだよ」と指示するキーワードです。

2. asyncio.sleep(2)

  • time.sleep(2) と違い、これは**2秒間「寝てるけど、他の処理に道を譲る」(CPUをブロックせずに待機)**という挙動になります。

3. asyncio.gather(task1(), task2())

  • これは task1 と task2 を同時に実行する仕組みです。
  • task1 の内部で await によって2秒間待っている間に、task2 が先に終わることが可能になります。

実行結果:

Task 2 完了
(2秒後)
Task 1 完了

このように、task2 が先に表示されます。つまり、「待ってる間に別のことをやる」=非同期処理ができているということです。

6. どちらを使うべき?

シチュエーション処理方法
計算や順番が大切な処理同期処理
Webのデータ取得、ファイルの読み込みなど非同期処理(待ち時間を有効活用)

たとえば、ウェブサイトから情報を取ってくるときは、そのデータを待っている間に他の作業と並行できると効率的です。そんなときに非同期処理が大活躍します。


7. まとめ

  • 同期処理は「順番通りに一つずつ実行、待ち時間あり」
  • 非同期処理は「待っている間に他の作業を並行して実行」
  • Pythonでは async / await / asyncio を使って非同期処理を実現できる

プログラムが重くなったり、時間のかかる処理が多くなると、非同期処理を使うことで効率的でスムーズな動きを実現できます。


「順番にやる(同期)」と「並行してやる(非同期)」という違いを意識するだけで、プログラミングが一段と理解しやすくなります!

コメント

タイトルとURLをコピーしました