##前書き
同期処理や非同期処理の概要をまとめてみました。
コールバック関数、Promise、async / awaitなど今後まとめていきたいと思います。
##同期処理・非同期処理の説明の前に
###PCの計算時間について
例 | 時間 |
---|---|
CPUの1サイクル | およそ0.3ナノ秒 |
Floatの足し算 | 1.2ナノ秒 |
メモリのデータを参照する速さ | 120ナノ秒 |
SSDからのデータの読み取り | 100マイクロ秒(マイクロ秒はナノ秒の1000倍) |
日本からシリコンバレにインターネットでやりとりする時間 | 100ミリ秒(ミリ秒はマイクロ秒の1000倍) |
####CPUの1サイクルを1秒とした場合
例 | 時間 |
---|---|
CPUの1サイクル | 1秒 |
Floatの足し算 | 4秒 |
メモリのデータを参照する速さ | 6分 |
SSDからのデータの読み取り | 4日 |
日本からシリコンバレーにインターネットでやりとりする時間 | およそ10年 |
CPUで計算したり、メモリからデータを参照する事と比べて、インターネットを通じてデータを取得するというのはものすごく時間がかかる事が分かります。
##同期処理とは
コードを順番に処理していき、ひとつの処理が終わるまで次の処理は行わない処理の事です。
どんなに時間のかかる処理を行っていたとしても、同期処理の場合はその処理が終わるまで待ちます。
二つ例を出してみます。
####ネットワーク通信の場合
同期処理でネットワーク通信を行った場合、時間のかかるインターネット通信が終わってからじゃないと次の処理を行うことができません。
CPUの1サイクルを1秒とした場合、ネットワーク通信は10年かかります。
その間に色々計算できそうですが、10年後にならないと他の処理ができないのでリソース的に勿体無いですよね。
####人間世界の場合
人間世界を例として以下のことをしたいとします。
- お風呂に入る ->自分
- 食洗機で食器を洗う ->食洗機
- 食器を片付ける ->自分
同期処理の場合だと自分がお風呂に入り終わったら食洗機で食器を洗い、洗い終わったら自分が干すという処理になります。
これだと食洗機が皿を洗ってる間に自分というリソースは使用されず放置状態になります。
##非同期処理とは
処理が終わるのを待たずに、同時に複数の処理を実行することができます。
誰かに仕事をお願いする事で、自分は他の仕事を進める事ができる仕組みです。
その結果、複数処理を実行する事ができます。
先ほど例にあげたネット通信も非同期で行った場合、ネット通信の結果を待たず、CPUの計算も行う事ができます。
人間世界の例も同様です。
食洗機に頑張って食器を洗ってもらう間に自分はお風呂に入ってしまいます。
結果として同期処理より早く処理を終える事ができます。
このように非同期処理では誰かに仕事をお願いすることで自分は別の作業を進める事ができ、結果として同時に複数の処理を行う事ができます。
##参考