Web workerの概要
3242 ワード
Web workerの概要
通常、ブラウザがプログラムを実行すると、実行が終了するまで通常の状態に戻るのがブロックされますが、HTML 5のWeb Workerはこの問題を解決するためです.ワークスレッドによる密計算を完了し、プログラムのブロックやページのカートン(fpsが低すぎる)を回避
例
fibonacci数列を用いてテストをシミュレートする
worker-test.html
worker.js
ホームページ上で時間のかかる操作(fibonacciなど)を複数回実行する必要があると仮定すると、以下のようにworkerで非同期で実行することができる.
ドメイン間およびスクリプトの導入
ホームフェースでworkerをインスタンス化するには、
ワークの方法 を終了する
制限ホームページのグローバル変数と関数にアクセスできません.window、documentがありません.ただし、location、navigator にアクセスできます.はsettimeout、setIntervalをサポートし、ajax を開始することができる. workerはdom にアクセスおよび操作できません. postMessageが送信するデータはコピーされ、同じメモリアドレス を指すことはありません.
転載先:https://www.cnblogs.com/stephenykk/p/8608450.html
通常、ブラウザがプログラムを実行すると、実行が終了するまで通常の状態に戻るのがブロックされますが、HTML 5のWeb Workerはこの問題を解決するためです.ワークスレッドによる密計算を完了し、プログラムのブロックやページのカートン(fpsが低すぎる)を回避
例
fibonacci数列を用いてテストをシミュレートする
worker-test.html
web worker
function fibonacci(n) {
return n < 2 ? n : arguments.callee(n - 1) + arguments.callee(n - 2);
}
function testNoWorker() {
let start = Date.now();
fibonacci(38);
let end = Date.now();
console.log(end - start); // wait a long time..
}
function testUseWorker() {
let start = Date.now();
let worker = new Worker('worker.js');
worker.postMessage(38);
worker.addEventListener('message', function (event) {
let end = Date.now();
console.log('worker result: ', end -start);
});
console.log('can do other jobs, when worker is computing');
}
testNoWorker();
testUseWorker();
worker.js
function fibonacci(n) {
return n < 2 ? n : arguments.callee(n-1) + arguments.callee(n-2);
}
self.addEventListener('message', function (event) {
let result = fibonacci(event.data);
self.postMessage(result);
});
// setTimeout , setInterval
setTimeout(() => {
console.log('timeout..');
}, 100);
setInterval(() => {
console.log('setInterval...');
}, 200);
// ajax
fetch('data.json').then(res => res.json()).then(data => {console.log(data, '
ホームページ上で時間のかかる操作(fibonacciなど)を複数回実行する必要があると仮定すると、以下のようにworkerで非同期で実行することができる.
web worker
function fibonacci(n) {
let start = Date.now();
let worker = new Worker('worker.js');
worker.addEventListener('message', function (event) {
let end = Date.now();
console.log('worker result: ', end - start);
});
worker.postMessage(n);
}
/* worker, worker ; */
fibonacci(38);
console.log('after one');
fibonacci(38);
console.log('after two');
fibonacci(38);
console.log('after three');
console.log('can handle other jobs..');
ドメイン間およびスクリプトの導入
ホームフェースでworkerをインスタンス化するには、
new Worker('/url/to/worker.js')
workerスクリプトをホームフェースと同じドメインにする必要があります.workerスクリプトでは、self.importScripts('url/to/script.js')
は任意のドメインのスクリプトをインポートできます.複数のself.importScripts()
は順次同期ロードされます.ワークの方法
worker.terminate()
workerスレッド制限
転載先:https://www.cnblogs.com/stephenykk/p/8608450.html