JavaScriptシングルスレッドと非同期
6612 ワード
シングルスレッドおよび非同期Event Loop
1.単一スレッド
シングルスレッドとは?非同期と何の関係があるの?
単一スレッド:同じ時間に1つのことしかできません.
単一スレッドを使用する理由
DOMレンダリングの競合を回避するために.(ブラウザはDOMをレンダリングする必要があるので、JSはDOMを修正することもできます.1つのレンダリングノードはもう1つのノードを削除しました.それはいったいどうしますか)
HTML 5はwebsorkerがマルチスレッドをサポートすることを提案しているが,DOMにもアクセスできないという点でもこの説を検証している.
(JS実行ブラウザDOMレンダリング一時停止)つまり、JS実行の優先度はブラウザレンダリングの2つのJSよりも高く、同時に実行できない(いずれもDOMを変更すると競合する)
シングルスレッドの問題
単一スレッドは、すべてのタスクがキューに並ぶ必要があることを意味し、次のタスクを実行し続けるには1つのタスクを実行しますが、前のタスクが長い場合は、後のタスクはずっと待つ必要があります.
次の例は、単一スレッド同期の操作です.最初から最後まで実行する必要があります.
並んでいるのは計算量が多いため、CPUが忙しくて手が回らないので、まあいいのですが、多くの場合CPUは暇で、IOデバイス(入出力デバイス)が遅いので(例えばAjax操作でネットワークからデータを読み取る)、結果が出るのを待ってから下へ実行しなければなりません.
2.ソリューション-非同期
まず非同期を見てみましょう.私たちがよく使うsettimeout、setInterval、ajaxリクエストは非同期操作に属しています.
プライマリ・スレッドは、I/Oデバイスに関係なく、待機中のタスクを保留し、後ろに並んだタスクを先に実行できます.IOデバイスが結果を返すまで、振り返って、保留中のタスクを実行し続けます.
非同期はどのように実現されますか?
JSのすべてのタスクは、同期タスクと非同期タスクの2つに分けることができます.
タスク全体の実行メカニズムは次のとおりです.は、すべての同期タスクをメインスレッド上に配置し、実行スタック を形成する.は、すべての非同期タスクを一時停止し、条件に達すると「タスクキュー」(イベントのリスニング、イベントのトリガー) に格納する.メインスレッド上のすべての同期タスクを実行すると、システムは「タスクキュー」にそれらのタスクがあることを表示し、非同期タスクは待機状態を終了し、実行スタックに入り、 の実行を開始する.システムは、メインスレッドとタスクキューの間で、上記の第3ステップ を繰り返しポーリングする.
3.Event Loop
メインスレッドは「タスクキュー」からイベントを読み込み、ループを繰り返すプロセス全体をEvent Loop(イベントポーリング)と呼びます.
上記のステップ3について説明します.
メインスレッド上のすべての同期タスクが実行すると、システムは、非同期タスクが終了する待機状態で、実行スタックに入り、実行を開始する.(スタック内のコードは、「タスクキュー」に様々なイベント(click,load,done)を追加する様々な外部APIを呼び出す.スタック内のコードの実行が完了すると、メインスレッドは「タスクキュー」を読み出し、それらのイベントに対応するコールバック関数を順次実行します)
それともこの例ですか:settimeoutは1秒で(条件に達した)タスクキューに入れられ、システムにポーリングされ、メインスレッドに投げ込まれて印刷を実行します.
非同期の欠点を述べるは書き方に従って実行する、可読性が悪い である. callbackモジュール化が容易でない これも後のES 6規格が正式に提案されたPromiseが敷き詰められています
延長読書:[チェン一峰先生のJavaScript運行メカニズム詳細:Event Loopについて]http://www.ruanyifeng.com/blog/2014/10/event-loop.html
1.単一スレッド
シングルスレッドとは?非同期と何の関係があるの?
単一スレッド:同じ時間に1つのことしかできません.
単一スレッドを使用する理由
DOMレンダリングの競合を回避するために.(ブラウザはDOMをレンダリングする必要があるので、JSはDOMを修正することもできます.1つのレンダリングノードはもう1つのノードを削除しました.それはいったいどうしますか)
HTML 5はwebsorkerがマルチスレッドをサポートすることを提案しているが,DOMにもアクセスできないという点でもこの説を検証している.
(JS実行ブラウザDOMレンダリング一時停止)つまり、JS実行の優先度はブラウザレンダリングの2つのJSよりも高く、同時に実行できない(いずれもDOMを変更すると競合する)
シングルスレッドの問題
単一スレッドは、すべてのタスクがキューに並ぶ必要があることを意味し、次のタスクを実行し続けるには1つのタスクを実行しますが、前のタスクが長い場合は、後のタスクはずっと待つ必要があります.
次の例は、単一スレッド同期の操作です.最初から最後まで実行する必要があります.
//
var i,sum = 0;
for(i = 0; i < 100000000; i++){
sum += 1;
}
console.log(sum)
//alert
alert(1);
console.log(2);
alert(3)
並んでいるのは計算量が多いため、CPUが忙しくて手が回らないので、まあいいのですが、多くの場合CPUは暇で、IOデバイス(入出力デバイス)が遅いので(例えばAjax操作でネットワークからデータを読み取る)、結果が出るのを待ってから下へ実行しなければなりません.
2.ソリューション-非同期
まず非同期を見てみましょう.私たちがよく使うsettimeout、setInterval、ajaxリクエストは非同期操作に属しています.
プライマリ・スレッドは、I/Oデバイスに関係なく、待機中のタスクを保留し、後ろに並んだタスクを先に実行できます.IOデバイスが結果を返すまで、振り返って、保留中のタスクを実行し続けます.
console.log(100)
setTimeout(function(){
console.log(200)
},1000)
$.ajax({
url:'./demo.js',
success: function(result){
console.log(result)
}
})
console.log(300)
//100
//300
//200
非同期はどのように実現されますか?
JSのすべてのタスクは、同期タスクと非同期タスクの2つに分けることができます.
タスク全体の実行メカニズムは次のとおりです.
3.Event Loop
メインスレッドは「タスクキュー」からイベントを読み込み、ループを繰り返すプロセス全体をEvent Loop(イベントポーリング)と呼びます.
上記のステップ3について説明します.
メインスレッド上のすべての同期タスクが実行すると、システムは、非同期タスクが終了する待機状態で、実行スタックに入り、実行を開始する.(スタック内のコードは、「タスクキュー」に様々なイベント(click,load,done)を追加する様々な外部APIを呼び出す.スタック内のコードの実行が完了すると、メインスレッドは「タスクキュー」を読み出し、それらのイベントに対応するコールバック関数を順次実行します)
console.log(100)
setTimeout(function(){
console.log(200)
},1000)
console.log(300)
それともこの例ですか:settimeoutは1秒で(条件に達した)タスクキューに入れられ、システムにポーリングされ、メインスレッドに投げ込まれて印刷を実行します.
非同期の欠点を述べる
延長読書:[チェン一峰先生のJavaScript運行メカニズム詳細:Event Loopについて]http://www.ruanyifeng.com/blog/2014/10/event-loop.html