非同期処理 ひどうきしょり
同期処理コールバック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/await | Promiseを同期的に書けるシンタックスシュガー | 現在のJavaScript標準 |
| イベントループ | 処理完了の通知を順番に拾う仕組み | Node.js・ブラウザ |
| マルチスレッド | 複数の処理を並列に走らせる | Java・C#・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 非同期:フローで見る
よくある実装例(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のサーバーサイド実行環境