解説
「Web Workers」は、Webページでスクリプトを、バックグラウンドのスレッドで実行するための手段です。
JavaScriptは、シングルスレッドのプログラミング言語です。そして、実行中は、WebブラウザのUIなどの処理を停止させます。Web Workersは、こうした問題を解決して、他のスレッドで計算を行うためのものです。
Web Workersに対応しているWebブラウザでは、window.Workerオブジェクトを、ファイルのURIを引数にして初期化することで、Web Workersの機能を利用できます。
サンプル
「Web Workers」のサンプルです。ファイルはUTF-8で保存してください。検証はGoogle Chromeで行っています。
1つ目は、Web Workersを利用しないサンプルで、重い処理を実行している間、スクロールができなくなります。2つ目は、Web Workersを利用したサンプルで、重い処理を実行している間も、スクロールができます。
セキュリティ上の理由で、Webブラウザによっては、138_js2.htmlからtask.jsの読み込みがサーバー上でしかできません。サンプルの利用は、サーバー上で行ってください。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>「Web Workers」のサンプル1 - Web Workers なし</title>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
<script>
// 重い処理を実行している間、スクロールできない
$(function() {
setTimeout(function() {
$('#out').append('start<br>');
setTimeout(function() {
var len = 500000000;
var n = 0;
for (var i = 0; i < len; i ++) {
if (len % i === 0) n ++;
}
$('#out').append('end ' + n);
}, 100);
}, 1000);
});
</script>
<div id="out" style="position: fixed;">output:<br></div>
<div style="height: 3000px;"></div>
</body>
</html>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>「Web Workers」のサンプル2 - Web Workers あり</title>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>
<script>
// 重い処理を実行していても、スクロールできる
var worker = new Worker('task.js');
$(function() {
setTimeout(function() {
$('#out').append('start<br>');
setTimeout(function() {
worker.onmessage = function(e) {
$('#out').append('end ' + e.data);
};
worker.postMessage(500000000);
}, 100);
}, 1000);
});
</script>
<div id="out" style="position: fixed;">output:<br></div>
<div style="height: 3000px;"></div>
</body>
</html>
onmessage = function (e) {
var len = e.data;
var n = 0;
for (var i = 0; i < len; i ++) {
if (len % i === 0) n ++;
}
postMessage(n);
};
- 実行結果(138_js1.html):Web Workers未使用。「start」が表示されてから「end」が表示されるまでスクロールできなくなる
- 実行結果(138_js2.html):Web Workders使用。「start」が表示された後も、引き続きスクロールできる
