okinawa

勉強メモ

非同期処理とマルチスレッドの違い

 

結論

同期処理と非同期処理の違い=待つか待たないか。
シングルスレッドとマルチスレッドの違い=単線か複線か。

 

同期処理

今の処理が終わるまで待つ。

次の処理は始まらない。

 

非同期処理

今の処理で待ち時間ができたら、次の処理を始める。

同時に実行しているわけではなく、待ってる間に次を始める

 

AさんがBさんに仕事を渡す

→Bさん仕事中

→AさんはBさんの仕事が終了するまで進められない

→Aさんは別の仕事を見つけてやり始める

 

ぼーーっとするくらいなら次にいこうねって感じ。

シングルスレッドで実装可能。

これが非同期処理。

 

シングルスレッド

同時実行不可。

 

マルチスレッド

同時実行可能。

 

キューとは

 順番待ち行列のこと。

1個ずつ処理されていく。

 

非同期処理の例

JavaScriptとHTTP

JavaScriptでHTTPにリクエスト送った。

HTTPからレスポンス返ってくるまで暇。

じゃあJavaScriptは別のことやるか。

HTTPから完了通知来たらキューに入れよ。

 

・CPUとプリンタ

CPUは高速だがプリンタは低速。

CPUからプリンタに指令を出した後、CPUはやることがない。

だから次の処理に移行する。

プリンタからの完了通知は割り込み信号によって検知する。

信号きたらキューに入る。

 

okwave.jp

setTimeoutは勘違いしやすい

function doSample() {
setTimeout(onFirst, 2000);
setTimeout(onSecond, 4000);
 
function onFirst() {
console.log("first")
}
 
function onSecond() {
console.log("second")
}
}
doSample();

上記コードは合計4秒で完了する。

シングルスレッドなら2+4で合計6秒じゃないの?と思っていた。

 

だけど、setTimeoutはx秒後に処理を始めるという登録をするだけ。

なので処理は一瞬で完了するんだって。

 

seTimeout1実行→setTimeout2実行→2秒後に完了通知→4秒後に完了通知

ということ。

teratail.com

setTimeoutの疑問

待ち時間をカウントして完了通知を送る、という処理はJavaScriptではない何かがやっているということになる。

一体それはなんだろう?

 

参考↓

coliss.com

上記サイトによるとsetTimeoutは指定秒後に実行ではなく、指定秒後にキューに送るということらしい。

また、待ち時間のカウントはWebAPIがやっているらしい。

 

非同期処理で勘違いしていたところ

HTTPレスポンスが返ってくるまで別の処理をやる、みたいなのが多くて、これってリクエスト送る→レスポンス受け取るっていう処理と別の処理を同時にやっているんだからマルチスレッドじゃないか!みたいに思っていたがそんなことはなかった。

 

レスポンスを返してくるのはHTTPのお仕事であってJavaScriptではないので、その間にJavaScriptは別のことを1つやっているだけだよね。

 

JavaScriptでは必ず同期処理の完了後に非同期処理が完了するのはなぜか?

ここちゃんと調べてないので私の予想です。
同期処理1
非同期処理1
非同期処理2
同期処理1
----------
結果
同期処理1完了
同期処理2完了
非同期処理1完了
非同期処理2完了
--------
これは
  1. 同期処理1が開始&完了
  2. 非同期処理1が開始
  3. 非同期処理1完了後の処理1がキューに入る
  4. 非同期処理2が開始
  5. 非同期処理2完了後の処理2がキューに入る
  6. 同期処理2が開始&完了
  7. 非同期処理1の完了通知&完了
  8. 非同期処理2の完了通知&完了
ということなんじゃないかなと思う。
ちなみに最後の非同期処理1・2の完了は順不同です。
完了通知が来た順に完了するので。
 
コードにするとこう↓
console.log(1);
setTimeout(first,1000);
setTimeout(second,500);
console.log(2);
 
function first() {
console.log("first");
}
 
function second() {
console.log("second");
}
-------------
1
2
second
first
-------------