HTML5 WebWorker
24732 ワード
Web Workersは現在、w 3 cの提案するにすぎず、いつでも変更される可能性がありますが、Firefox、Safari、chromeはすでに自社製品に組み込まれています.Web Workersはブラウザに本当の非同期計算能力を提供し、web workerのコードはOSレベルのスレッドで実行されます.しかし、同期メカニズムがサポートされていない、実行時にjsコードがあるなど、Web workerがどの程度強くなるかは期待できません.それでも、web workerは、計算量の膨大さによるUI溶接などの問題を解決することができる.
Web workers #の使用
Mozillaには紹介するといういいものがあります.また、w 3 cの提案自体にはサンプルコードがあります.これらは参考になります.Web Workersの使用方法を具体的なコードで示します.
1.htmlにweb workerオブジェクトを作成します.
2.onmessageイベントをバインドし、workerが実装されたonmessageイベントのみがworkerの通知を受け取ることができます.
3.workerにメッセージを発行して実行を開始します.
4.workerのコードでは、onmessageを実装して外部のメッセージを受信し、計算が完了したらpostMessageで外部に通知する必要がある.
5.workerでは、サブworker(subworker)も生成できます.
SharedWorker #
chromeとsafariはsharedWorkerをサポートし、workerのデータを共有することができます.
html:
sharedWorker.js:
添付ファイルのdemoではiframeで別のhtml(もちろんこのhtmlは同じdomainの下にある)を導入し、このhtmlで同じshared workerを再使用します.shared workerが2つの外部呼び出しに対してデータcountを共有していることがわかります.
innerTest.htm:
表示アタッチメント
いくつかの重要な問題#
すべてのバージョンのIEはweb workerをサポートしていません.
workerのプロパティは親ページにアクセスできません.workerは親ページのDOMノードにアクセスできません.workerはメッセージイベントを通じて外部と通信することができます.
ChromeとSafariはsub workerをサポートしていません.Firefoxはshared worker をサポートしていません.
workerでsettimeout、setInterval を使用できます.
Web workerのパフォーマンスをあまり期待しないでください.Web workerの実行中に親ページにDOMを更新させるイベントが絶えず投げ出された場合、ブラウザは溶接されます.
Web workers #の使用
Mozillaには紹介するといういいものがあります.また、w 3 cの提案自体にはサンプルコードがあります.これらは参考になります.Web Workersの使用方法を具体的なコードで示します.
1.htmlにweb workerオブジェクトを作成します.
var worker = new Worker('worker.js');
2.onmessageイベントをバインドし、workerが実装されたonmessageイベントのみがworkerの通知を受け取ることができます.
worker.onmessage = function(event){
alert(event.data);
};
3.workerにメッセージを発行して実行を開始します.
worker.postMessage('go');
4.workerのコードでは、onmessageを実装して外部のメッセージを受信し、計算が完了したらpostMessageで外部に通知する必要がある.
onmessage = function(event){
if(event.data == 'go'){
postMessage('worker done!');
}
}
5.workerでは、サブworker(subworker)も生成できます.
//work.js:
var subworker = new Worker('subworker.js');
subworker.onmessage = function(e){
postMessage(e.data.msg)
}
//subWork.js:
postMessage({
msg: 'sub worker done'
});
SharedWorker #
chromeとsafariはsharedWorkerをサポートし、workerのデータを共有することができます.
html:
// SharedWorker
var sharedworker = new SharedWorker('sharedWorker.js');
sharedworker.port.onmessage = function(e) { // note: not worker.onmessage!
writeLog(e.data);
}
//sharedWorker addEventListener worker
sharedworker.port.addEventListener('message', function(e) {writeLog('listend:'+e.data);},false);
function testSharedWorker(){
sharedworker.port.start(); // note: need this when using addEventListener
sharedworker.port.postMessage('ping');
}
sharedWorker.js:
var count=0;
// shared worker onconnect
onconnect = function(e) {
var port = e.ports[0];
count++;
port.postMessage('Hello World! '+count);
port.onmessage = function(e) {
port.postMessage('pong'); // not e.ports[0].postMessage!
}
}
添付ファイルのdemoではiframeで別のhtml(もちろんこのhtmlは同じdomainの下にある)を導入し、このhtmlで同じshared workerを再使用します.shared workerが2つの外部呼び出しに対してデータcountを共有していることがわかります.
innerTest.htm:
var sharedworker = new SharedWorker('sharedWorker.js');
sharedworker.port.postMessage();
表示アタッチメント
いくつかの重要な問題#
すべてのバージョンのIEはweb workerをサポートしていません.
workerのプロパティは親ページにアクセスできません.workerは親ページのDOMノードにアクセスできません.workerはメッセージイベントを通じて外部と通信することができます.
ChromeとSafariはsub workerをサポートしていません.Firefoxはshared worker をサポートしていません.
workerでsettimeout、setInterval を使用できます.
Web workerのパフォーマンスをあまり期待しないでください.Web workerの実行中に親ページにDOMを更新させるイベントが絶えず投げ出された場合、ブラウザは溶接されます.