結論
同期処理と非同期処理の違い=待つか待たないか。
シングルスレッドとマルチスレッドの違い=単線か複線か。
同期処理
今の処理が終わるまで待つ。
次の処理は始まらない。
非同期処理
今の処理で待ち時間ができたら、次の処理を始める。
同時に実行しているわけではなく、待ってる間に次を始める。
例
AさんがBさんに仕事を渡す
→Bさん仕事中
→AさんはBさんの仕事が終了するまで進められない
→Aさんは別の仕事を見つけてやり始める
ぼーーっとするくらいなら次にいこうねって感じ。
シングルスレッドで実装可能。
これが非同期処理。
シングルスレッド
同時実行不可。
マルチスレッド
同時実行可能。
キューとは
順番待ち行列のこと。
1個ずつ処理されていく。
非同期処理の例
・JavaScriptとHTTP
JavaScriptでHTTPにリクエスト送った。
HTTPからレスポンス返ってくるまで暇。
じゃあJavaScriptは別のことやるか。
HTTPから完了通知来たらキューに入れよ。
・CPUとプリンタ
CPUは高速だがプリンタは低速。
CPUからプリンタに指令を出した後、CPUはやることがない。
だから次の処理に移行する。
プリンタからの完了通知は割り込み信号によって検知する。
信号きたらキューに入る。
setTimeoutは勘違いしやすい
上記コードは合計4秒で完了する。
シングルスレッドなら2+4で合計6秒じゃないの?と思っていた。
だけど、setTimeoutはx秒後に処理を始めるという登録をするだけ。
なので処理は一瞬で完了するんだって。
seTimeout1実行→setTimeout2実行→2秒後に完了通知→4秒後に完了通知
ということ。
setTimeoutの疑問
待ち時間をカウントして完了通知を送る、という処理はJavaScriptではない何かがやっているということになる。
一体それはなんだろう?
参考↓
上記サイトによるとsetTimeoutは指定秒後に実行ではなく、指定秒後にキューに送るということらしい。
また、待ち時間のカウントはWebAPIがやっているらしい。
非同期処理で勘違いしていたところ
HTTPレスポンスが返ってくるまで別の処理をやる、みたいなのが多くて、これってリクエスト送る→レスポンス受け取るっていう処理と別の処理を同時にやっているんだからマルチスレッドじゃないか!みたいに思っていたがそんなことはなかった。
レスポンスを返してくるのはHTTPのお仕事であってJavaScriptではないので、その間にJavaScriptは別のことを1つやっているだけだよね。
JavaScriptでは必ず同期処理の完了後に非同期処理が完了するのはなぜか?
-
同期処理1が開始&完了
-
非同期処理1が開始
-
非同期処理1完了後の処理1がキューに入る
-
非同期処理2が開始
-
非同期処理2完了後の処理2がキューに入る
-
同期処理2が開始&完了
-
非同期処理1の完了通知&完了
-
非同期処理2の完了通知&完了