【11】JavaScriptスレッドメカニズムとイベントメカニズム
7636 ワード
JavaScript
スレッド機構とイベント機構一、プロセスとスレッド
プロセス(
process
)windows
タスクマネージャを介してプロセスを見ることができる.thread
)CPU
の最小スケジューリングユニットである.関連知識
thread pool
):複数のスレッドオブジェクトを格納する容器で、スレッドオブジェクトの繰り返し利用を実現する.(1)プロセスとマルチスレッドとは?
CPU
の利用率を効果的に向上させることができる.JS
はシングルスレッドですか?それともマルチスレッドですか?JS
はシングルスレッドで実行されています.H5
のWeb Workers
を使用してマルチスレッドを実行することができる.Firefox
IE
Chrome
Firefox
IE
(1)ブラウザのカーネルは、ブラウザの実行をサポートする最も核心的なプログラムである.
(2)ブラウザのカーネルが異なる:
Chrome
、Safari
:webkit
Firefox
:Gecko
IE
:Trident
360
、犬などの国内ブラウザ:Trident+webkit
js
エンジンモジュール:js
プログラムのコンパイルと実行を担当する.html
、css
ドキュメント解析モジュール:ページテキストの解析を担当する.DOM/CSS
モジュール:DOM/CSS
のメモリ内の関連処理を担当する.DOM
イベント応答モジュール:イベントの管理を担当する.ajax
).(1)タイマーは本当にタイミングで実行されますか?
document.getElementById('btn').onclick = function () {
var start = Date.now()
console.log(' ...')
setTimeout(function () {
console.log(' ', Date.now()-start)
}, 200)
console.log(' ...')
}
上記のコールバック関数に長時間のタスクを追加します.document.getElementById('btn').onclick = function () {
var start = Date.now()
console.log(' ...')
setTimeout(function () {
console.log(' ', Date.now()-start)
}, 200)
console.log(' ...')
//
for (var i = 0; i < 1000000000; i++) {}
}
結果:同期タスクが完了したら、非同期タスクが実行されます.
(2)タイマーのコールバック関数は、ライン分けで実行されますか?
js
は単スレッドである.JS
は単一スレッドで実行されます.(1)
js
の実行がシングルスレッドであることをどう証明しますか?setTimeout()
のコールバック関数は、メインスレッドで実行される.js
は、マルチスレッドモードではなく、シングルスレッドモードを使用するのですか?JavaScript
の単一スレッドは、その用途に関連している.JavaScript
の主な用途は、ユーザとの対話と、動作DOM
である.(3)コードの分類:
js
エンジン実行コードの基本的な流れajax
要求ブラウザのイベント循環モデルの原理図
関連の重要な概念
(1)実行スタック
execution stack
browser core
js
エンジンモジュール(メインスレッドで処理)callback queue
)task queue
(4)メッセージ・キュー(callback queue
)message queue
(5)イベントキュー(callback queue
) event queue
(6)イベントポーリングevent loop
event-driven interaction model
(8)要求応答モデル request-response model
実行プロセス(1)すべてのコードの分類:
dom
イベントの傍受を含み、タイマーを設定し、ajax
に要求されたコードを送信する実行コードを初期化する.js
エンジン実行コードの基本的な流れ:(a)イニシャルコードを実行し、イベントコールバック関数を対応モジュールに渡して管理する.
(b)イベントが発生すると、管理モジュールは、コールバック関数とデータをコールバック列に追加します.
(c)最初のコードが実行された後(一定の時間がかかるかもしれない)のみ、コールバックキューのコールバック関数を介して実行されます.
六、
H5 Web Workers
(マルチスレッド)紹介する
Web Workers
は、HTML5
が提供するJavascript
マルチスレッドソリューションである.Web Worker
によって実行することができます.DOM
を動作させてはならない.したがって、この新しい標準はJavaScript
単スレッドの本質を変えていない.使用
API
Worker
:コンストラクタは、線分路で実行されるjs
ファイルをロードする.Worker.prototype.onmessage
:他のスレッドを受信するためのコールバック関数.Worker.prototype.postMessage
:メッセージを他のスレッドに送信する.JS
ファイルvar onmessage = function (event){ //
console.log('onMessage()22');
var upper = event.data.toUpperCase();// event.data
postMessage( upper );//
}
JS
にメッセージを送信し、フィードバック// Worker URL
var worker = new Worker("worker.js");
// worker
worker.onmessage = function (event) {
console.log(event.data);
};
// worker
worker.postMessage("hello world");
図解応用練習
(Fibonacci sequence)
F(0)=0,F(1)=1,..... F(n)=F(n-1)+F(n-2)
var fibonacci =function(n) {
return n <2 ? n : fibonacci(n -1) + fibonacci(n -2);
};
console.log(fibonacci(48));
Web Workers
を使用してスレッドを分けている:var worker = new Worker('worker2.js');
worker.addEventListener('message', function (event) {
var timer2 = new Date().getTime();
console.log(' :' + event.data, ' :' + timer2, ' :' + ( timer2 - timer ));
}, false);
var timer = new Date().getTime();
console.log(' : ', ' :' + timer);
setTimeout(function () {
console.log(' ', ' :' + new Date().getTime());
}, 1000);
worker.postMessage(40);
console.log(' ', ' :' + new Date().getTime());
var fibonacci =function(n) {
return n <2 ? n : fibonacci(n -1) + fibonacci(n -2);
};
var onmessage = function(event) {
var n = parseInt(event.data, 10);
postMessage(fibonacci(n));
};
足りないJS
をロードすることができません.worker
内のコードはDOM
にアクセスできません.