はじめに
先日、面接で非同期処理について説明してほしいと言われたので、説明したところ「とてもうまく説明できていると思います」と褒められて嬉しかったので書き残しておきます。
自分自身、先週やっと非同期について附に落ちたのでわからない人の立場から説明していけると思います。
非同期処理の定義
非同期処理は、あるタスクが実行をしている際に、他のタスクが別の処理を実行できる方式である。 同期処理では、あるタスクが実行している間、他のタスクの処理は中断される方式である。 - 非同期処理を入れ、多重にコンテキストを用意することにより処理速度の向上を目指す設計が行われる。
参考: http://ossforum.jp/node/753
これで理解できてしまった人はこれ以降読む必要ないです
同期処理
プログラムというのは基本的に上から順に処理が進んでいきます。
しかし、もしデータベースとのやりとりなど重い処理が途中で行われる場合、その処理が終わるまで次の処理を実行できません。
簡単に表すとこのようになります。
処理
↓
重い処理(めっちゃ時間かかる)
↓
重い処理(まためっちゃ時間かかる)
↓
完了
例えば、アカウント作成後にDBに登録されているユーザー全員の名前やemailを表示するようなホームページに遷移する処理を実装するとします。
名前とemailを入力
↓
DBにその値を登録
↓
DBに登録されているユーザー全員の情報を取得
↓
ホームページに遷移して、その値を表示する
DBとの通信には時間がかかるので、
DBにその値を登録
DBに登録されているユーザー全員の情報を取得
この二つの処理をそれぞれ待つ場合、それぞれの処理にかかる時間の合計分待たなければならなくなります。
非同期処理
ではこれを非同期で行うとどうなるのか。
名前とemailを入力
↓
DBにその値を登録
↓(登録が終わるのを待たずに次の処理へ)
DBに登録されているユーザー全員の情報を取得
↓(全ての処理が終わったら)
ホームページに遷移して、その値を表示する
登録処理が終わるのを待たずにこちらの処理DBに登録されているユーザー全員の情報を取得
に移るので、無駄な時間をかけずに処理を進められます。
ここで冒頭の定義に戻ってみましょう。
非同期処理は、あるタスクが実行をしている際に、他のタスクが別の処理を実行できる方式である。 同期処理では、あるタスクが実行している間、他のタスクの処理は中断される方式である。 - 非同期処理を入れ、多重にコンテキストを用意することにより処理速度の向上を目指す設計が行われる。
全体を読んだ今では理解できるのではないでしょうか?
最後に
( )内でpromiseやasync, awaitなどの処理が行われているので、これを読んだ後にそれらについての記事を読めば理解度も増すのではないかと思います。