
「この処理は同期的に実行されるから、完了を待つ必要がある」
プログラミング、特にJavaScriptやWeb開発を学んでいると、必ずと言っていいほど登場するのが**「同期処理」と「非同期処理」**という言葉です。
この2つの概念は、プログラムのパフォーマンスや、ユーザー体験(UX)を大きく左右する、非常に重要な考え方です。
しかし、その違いは初心者にとって、少しイメージしづらいかもしれません。
この記事では、IT知識ゼロの初心者の方でも、同期・非同期処理の本質がスッキリと理解できるように、わかりやすく解説していきます。
-
人気のラーメン屋さんの行列に例えて、その違いを徹底解説
-
それぞれのメリット・デメリット
-
どんな場面で、どちらが使われるのか
-
なぜ、特にJavaScriptでこの概念が重要なのか
同期処理・非同期処理のすべては「一つの処理が終わるのを待つか、待たないか」
同期処理と非同期処理の根本的な違いは、たった一つです。
それは、**「時間のかかる一つの処理を呼び出したとき、その処理が終わるのを、その場でじっと待つか、待たないか」**という点に尽きます。
この違いを、大人気のラーメン屋さんに並ぶお客さんと、店員さんの働き方に例えて、見ていきましょう。
同期処理:「真面目で、一つずつ順番にこなす店員さん」
ここに、非常に真面目で、一つの仕事が終わるまで絶対に次の仕事に手を出さない、ベテラン店員さんが一人いるラーメン屋さんがあります。
【同期的なお店の流れ】
-
**Aさん(お客さん)**が来店し、「醤油ラーメンを一杯!」と注文します。
-
店員さんは、Aさんの注文を受けたら、すぐに厨房に入り、麺を茹で始めます。
-
(ここが重要!) 店員さんは、麺が茹で上がり、ラーメンが完成するまで、厨房の前でじっと待ち続けます。 この間、レジは無人になり、次のお客さんであるBさんやCさんが「すみませーん!」と呼んでも、店員さんはAさんのラーメンが完成するまで、一切対応できません。
-
Aさんのラーメンが完成し、提供が終わって初めて、店員さんはレジに戻り、次のBさんの注文を取りに行きます。
特徴
- プログラムは、書かれた上から順番に、一つずつ実行される。
- 一つの処理が終わるまで、次の処理には進まない(処理がブロックされる)。
- 処理の流れが直感的で、理解しやすい。
非同期処理:「要領が良くて、待ち時間を有効活用する店員さん」
次に、非常に要領が良く、待ち時間を無駄にしない、スーパー店員さんが一人いるラーメン屋さんを見てみましょう。
【非同期的なお店の流れ】
-
**Aさん(お客さん)**が来店し、「醤油ラーメンを一杯!」と注文します。
-
店員さんは、Aさんの注文を受けたら、すぐに厨房に注文票を渡し、「醤油ラーメン一丁!できたら教えて!」と伝えます。
-
(ここが重要!) 店員さんは、Aさんのラーメンが出来上がるのを待ちません。 すぐにレジに戻り、次のBさんの注文を取りに行きます。「塩ラーメンですね!厨房に伝えておきます!」
-
さらに、Cさんの注文も取ります。「味噌ラーメンですね!承知しました!」
-
店員さんがBさん、Cさんの注文をさばいている途中で、厨房から「お待たせしました!醤油ラーメン、上がりましたよ!」と声がかかります。
-
その声を聞いた店員さんは、そのタイミングでAさんの元へ、完成した醤油ラーメンを運びに行きます。
-
特徴
-
時間のかかる処理を呼び出しても、その完了を待たずに、すぐに次の処理に進む。
-
時間のかかる処理は、裏側で勝手に進められる。
-
処理が終わったら、**「終わりましたよ」という通知(コールバック)**が来て、その後の処理が実行される。
-
同期処理・非同期処理のメリットとデメリット、そして使い分け
同期処理 | 非同期処理 | |
メリット |
|
|
デメリット |
|
|
同期処理が使われる場面
-
処理の順序が非常に重要な場合
-
銀行の振込処理:「①残高を確認する」→「②送金先の口座にお金を振り込む」→「③自分の口座から残高を引く」。この順序が崩れると、大変なことになります。このような一連の処理(トランザクション)は、同期的に実行される必要があります。
-
-
シンプルなスクリプト
-
書いた上から順番に実行されれば良い、単純なプログラム。
-
非同期処理が使われる場面
-
時間のかかるI/O(入出力)処理が伴う場合
-
Web APIからのデータ取得:外部のサーバーからデータを取ってくるのには、数秒かかることもあります。この間、画面が固まってしまったら、ユーザーはアプリを閉じてしまうでしょう。
-
ファイルの読み書き:大きなサイズのファイルを読み込む処理。
-
タイマー処理:setTimeoutのように、「3秒後にこの処理を実行して」とお願いする場合。
-
なぜ、JavaScriptで「非同期」が重要なのか?
同期・非同期の概念は多くの言語に存在しますが、特にJavaScriptの世界では、この「非同期」が極めて重要なキーワードとなります。
その理由は、JavaScriptがもともと**「シングルスレッド」、つまり「店員さんが一人しかいない」**という言語仕様だからです。
店員さんが一人しかいない同期的なお店では、一人の客のラーメンが出来上がるまで、店全体が完全にストップしてしまいましたよね。
Webブラウザで動くJavaScriptも同じです。もし、重たいデータ取得を同期的に行ってしまうと、その間、Webページ上のすべての操作(ボタンのクリック、スクロールなど)が、完全にフリーズしてしまうのです。
これは、致命的なユーザー体験の悪化に繋がります。
このJavaScriptの非同期処理を、サーバーサイドでも効率的に活用したのが**「Node.js」**です。Node.jsが、シングルスレッドでありながら高いパフォーマンスを発揮できる秘密は、この非同期処理の仕組みにあります。
「JavaScriptって、Webブラウザで動く言語だよね?」「サーバーサイドって、PHPとかRubyとか、別の言語が必要なんじゃないの?」 JavaScriptを学び始めた多くの人が、かつてはそう思っていまし[…]
【JavaScriptにおける非同期処理の書き方】
昔は「コールバック関数」という、コードが複雑になりがちな(通称:コールバック地獄)書き方が主流でしたが、現在では、より直感的に書ける、新しい構文が用意されています。
-
Promise:非同期処理の「未来の結果」を表すオブジェクト。
-
async/await:Promiseを、まるで同期処理のように、スッキリとした見た目で書くことができる、魔法のような構文。
まとめ
同期処理と非同期処理の違いは、時間のかかるタスクに対する「待ち方」の違いです。
-
同期処理は、一つのタスクが終わるまで、その場でじっと待つ、真面目で直列な処理方式。
-
非同期処理は、タスクの完了を待たずに次の仕事に進み、終わったら知らせてもらう、要領が良く並行的な処理方式。
Webの世界では、ユーザーを待たせない快適な体験を提供するために、非同期処理が不可欠です。特に、JavaScript(そしてNode.js)は、この非同期処理を前提として設計された言語であり、その仕組みを理解することが、一人前のWeb開発者になるための登竜門と言えます。
「この処理は、待つべきか、待たざるべきか」。
この視点を持つだけで、プログラムの動きが、より深く、より立体的に見えてくるはずです。
「Googleマップって、地図を動かしてもページ全体が再読み込みされなくて、サクサク動くのはなぜ?」「SNSで『いいね!』ボタンを押したら、ページが切り替わらずに、ボタンの色だけが変わった!」 私たちが普段使っている、このよう[…]