プログラミング基礎概念

非同期処理 ひどうきしょり

同期処理コールバックPromiseasync/awaitイベントループマルチスレッド
非同期処理について教えて

簡単に言うとこんな感じ!

カフェで注文したあと、できあがるまでスマホを触って待てるイメージだよ!「処理が終わるまでずっと待ち続けるんじゃなくて、別のことをしながら待てる」仕組みなんだ。Webページの読み込みやアプリの通信でめちゃくちゃ活躍してるってこと!


非同期処理とは

プログラムには「処理AをやってからBをやってからC…」と順番通りに実行される同期処理(逐次処理)と、「処理Aを開始したあと、終わるのを待たずに処理Bを始められる」非同期処理の2種類がある。

Webシステムやアプリ開発において、サーバーへのデータ通信・ファイルの読み書き・データベースへの問い合わせなど「時間のかかる処理」は非常に多い。もし画面の表示がこれらの処理を全部待ち続けていたら、ユーザーは「フリーズした?」と感じてしまう。非同期処理はこの「待ち時間の無駄」を解消するための重要な設計概念だ。

ビジネスの現場では、たとえばECサイトで在庫確認・決済・メール送信を同期処理で組むと、どれかが遅れると次の処理が詰まってしまう。非同期処理を活用することで、ユーザー体験(UX)の向上・システムのスループット(処理能力)の改善が実現できる。


同期処理との違い

比較項目同期処理非同期処理
処理の流れA→B→C と順番通りAをスタートしてBも動かす
待ち時間前の処理が終わるまで待つ待たずに別の処理を進められる
実装の難しさシンプルで読みやすい複雑になりやすい
向いている場面計算・バリデーションなど速い処理通信・ファイルI/O・DB問い合わせ
ユーザー体験処理中は画面が固まる可能性あり画面が固まらず操作を継続できる

カフェで例えると…

【同期処理】
店員:「コーヒーできるまで絶対動かないでください」
客 :(ひたすら突っ立って待つ)
→ 他のお客さんの注文もできない!

【非同期処理】
店員:「番号呼びますね。席でお待ちください」
客 :(席でスマホを見ながら待つ、他の人も注文できる)
→ みんなが効率よく動ける!

非同期処理を実現する主な技術

技術・手法概要使われる場面
コールバック関数処理が終わったら呼んでほしい関数を渡す古いJavaScriptのAPI
Promise「将来の値」を表すオブジェクト。成功・失敗を扱いやすくするモダンなJavaScript
async/awaitPromiseを同期的に書けるシンタックスシュガー現在のJavaScript標準
イベントループ処理完了の通知を順番に拾う仕組みNode.js・ブラウザ
マルチスレッド複数の処理を並列に走らせるJavaC#Python
メッセージキュー処理依頼をキューに積んで順次消化マイクロサービス・AWS SQS等

歴史と背景

  • 1960年代〜 — コンピュータが高価だった時代から「CPUを遊ばせないために」非同期・並行処理の概念が研究される
  • 1990年代 — GUIアプリの登場で「ユーザー操作中に画面を固めたくない」というニーズが急増。Windowsのメッセージループが普及
  • 2005年Ajax(Asynchronous JavaScript and XML) の概念がGoogleマップ等で注目され、Webでの非同期通信が一般化
  • 2009年Node.js 登場。イベントループベースの非同期I/Oにより、JavaScriptがサーバーサイドでも高パフォーマンスを発揮できることが証明された
  • 2012年Promise仕様 が整備され、コールバック地獄(Callback Hell)を解消する動きが加速
  • 2017年 — ECMAScript 2017で async/await が正式に標準化。非同期処理がより直感的に書けるようになった
  • 2020年代〜 — クラウド・マイクロサービス・サーバーレスの普及で、メッセージキュー(AWS SQS・Apache Kafkaなど)を使った非同期処理が基盤設計の常識に

同期 vs 非同期:フローで見る

同期処理 非同期処理 ① リクエスト送信 ② ⏳ ひたすら待つ… ③ ⏳ まだ待つ… ④ レスポンス受信 ⑤ 次の処理を実行 ① リクエスト送信 ② 別の処理A 通信待ち中… ③ 別の処理B 通信待ち中… ④ レスポンス受信(コールバック) ⑤ 結果を使って処理を続行 待ち時間中は何もできない 😰 待ち時間も有効活用できる 🎉

よくある実装例(JavaScript の async/await)

// 同期的な書き方に近い感覚で非同期処理を記述できる
async function fetchUserData(userId) {
  try {
    // awaitを付けることで、完了を待ってから次の行へ
    const response = await fetch(`/api/users/${userId}`);
    const data = await response.json();
    console.log(data); // データが取れてから実行される
  } catch (error) {
    console.error('エラーが発生しました:', error);
  }
}

発注・選定時に押さえておきたいポイント

システムを発注・選定する立場では、非同期処理の「どこに効いてくるか」を理解しておくと、ベンダーへの質問や要件定義に役立つ。

場面非同期処理との関係
ECサイトの注文フロー決済・在庫・メール送信を非同期化することで、ユーザーの待ち時間を短縮できる
管理画面のCSV出力大量データのエクスポートを非同期化し「完成したらメール通知」にすると画面が固まらない
API連携・外部サービス呼び出し外部APIのレスポンス待ちを非同期化しないと、外部障害が自社システム全体の遅延に直結する
通知・メール送信メインの処理とは切り離してメッセージキューに積み、非同期で送信するのが現代の標準構成

関連用語

  • 同期処理 — 処理を順番通りに実行し、完了を待ってから次へ進む方式
  • イベントループ — JavaScriptのランタイムが非同期処理の完了通知を拾う仕組み
  • Promise — 非同期処理の「将来の結果」を表すオブジェクト
  • コールバック関数 — 処理完了後に呼び出してほしい関数を引数として渡す仕組み
  • マルチスレッド — 複数のスレッドを並列に走らせてパフォーマンスを上げる仕組み
  • メッセージキュー — 処理依頼をキューに積んで非同期に消化するミドルウェア
  • API — 外部サービスと連携するインターフェース。非同期処理の典型的な使い所
  • Node.js — 非同期I/Oを得意とするJavaScriptのサーバーサイド実行環境