プログラムを書いていると、「同期処理」と「非同期処理」という言葉に出会うことがあります。
「なんだか難しそう…」
「結局、どう違うの?」
そんな初心者の方に向けて、わかりやすい例や図解で解説していきます!
目次
1. 同期処理とは?
同期処理は、1つの処理が終わるまで次の処理を待つ動きのことです。
特徴
- 順番通りに実行される
- 待ち時間が発生する
- 分かりやすいが、時間がかかることも
2. 非同期処理とは?
非同期処理は、待たずに次の処理を進められる動きのことです。
特徴
- 処理が同時進行できる(裏で進められる)
- 時間を効率的に使える
- 少し仕組みは複雑
3. 違いを簡単に比較
比較項目 | 同期処理 | 非同期処理 |
---|---|---|
実行の順序 | 順番通り | 待たずに次へ進む |
待ち時間の扱い | 待つ必要がある | 別の作業を並行できる |
わかりやすさ | 簡単・直感的 | 少し理解が必要 |
使いどころ | 単純な処理向き | 時間のかかる処理に向いてる |
4. 日常生活の例で理解しよう
同期処理の例:
- トースターでパンを焼く
- 焼き上がるまでじっと待つ
- 焼けたら、コーヒーを淹れる
⇨パンが焼け終わるまで、何もできない状態。
非同期処理の例:
- トースターでパンを焼き始める
- その間にコーヒーを淹れる
- 両方が終わったら一緒に食べる
⇨時間を無駄にせず、同時進行できる状態!
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
を使って非同期処理を実現できる
プログラムが重くなったり、時間のかかる処理が多くなると、非同期処理を使うことで効率的でスムーズな動きを実現できます。
「順番にやる(同期)」と「並行してやる(非同期)」という違いを意識するだけで、プログラミングが一段と理解しやすくなります!
コメント