HTML5 Web ワーカーLOGIN

HTML5 Web ワーカー

Web ワーカー

クライアントサイド JavaScript をマルチスレッド化できないという問題を解決するために、HTML5 仕様に Web ワーカーの概念が導入されました。Web ワーカーはコードの並列スレッドを参照します。自己完結型の環境であり、メインスレッドのウィンドウオブジェクトやドキュメントオブジェクトにアクセスできず、非同期メッセージパッシングメカニズムを通じてのみメインスレッドと通信することができません

実行したいJavaScriptコードを別個のjsに入れる必要がありますファイルを作成し、ページで Worker コンストラクターを呼び出します。パラメーターがファイル パスである場合、Worker コンストラクターを呼び出すステートメントを含むスクリプトを参照として使用する必要があります。絶対パスの場合は、同じソースであることを確認する必要があります (プロトコル + ホスト + ポート)。このファイルでは、ページに参​​照を表示するためにスクリプト タグを使用する必要はありません

var worker=new Worker('js/worker.js');

簡単な小さな例

0 ~ 10000 の間のすべてを表示しますページ n で割り切れる数値。もちろん i*n は使用しません。計算が少し複雑になります

index.html

<!DOCTYPE html>
<html>
<head>
    <title>Web Workers</title>
</head>
<body>
  <h1>Web Workers</h1>
      <div id="test" style="width:500px;"></div>
    <script type="text/javascript">
        var worker=new Worker('js/worker.js');
        worker.postMessage({
            n:69
        });
        worker.onmessage=function(e){
            var test=document.getElementById('test').innerHTML=e.data;        
        };
    </script>
</body>
</html>

/js/worker.js

function calc(n){
    var result=[];
    for(var i=1;i<10000;i++){
        var tem=i;
        if(i%n==0){
            if(i%(10*n)==0){
                tem+='<br/>';
            }
            result.push(tem);
        }
    }

    self.postMessage(result.join(' '));
    self.close();
}

onmessage=function(e){
    calc(e.data.n);
};

表示効果:

1018.png

Web ワーカー ファイルを作成する

次に、外部 JavaScript で Web ワーカーを作成しましょう。

ここではカウントスクリプトを作成しました。スクリプトは「demo_workers.js」ファイルに保存されます:

var i=0;

function timedCount()
{
i=i+1;
postMessage(i);
setTimeout("timedCount()" , 500);
}

timedCount();

上記のコードの重要な部分は postMessage() メソッドであり、HTML ページにメッセージを送り返すために使用されます。

注: Web ワーカーは通常、このような単純なスクリプトには使用されず、より CPU を集中的に使用するタスクに使用されます。

Web Worker オブジェクトを作成する

Web Worker ファイルは既にあるので、HTML ページからそれを呼び出す必要があります。

次のコードは、ワーカーが存在するかどうかを検出し、存在しない場合は、新しい Web ワーカー オブジェクトを作成して、「demo_workers.js」内のコードを実行します。

w=new Worker("demo_workers.js");

}

これで、Web ワーカーからメッセージを送受信できるようになります。
「onmessage」イベント リスナーを Web ワーカーに追加します:

w.onmessage=function(event){

document.getElementById("result").innerHTML=event.data;

};


< pweb="" work="" がメッセージを配信すると、イベント リスナーのコードが実行されます。 events.data="" には、""event.data="" のデータが含まれます。

Web ワーカーの終了

Web ワーカー オブジェクトを作成した後、Web ワーカー オブジェクトは終了されるまで (外部スクリプトが完了した後でも) メッセージをリッスンし続けます。 Web ワーカーを終了し、ブラウザ/コンピュータのリソースを解放するには、terminate() メソッドを使用してください:

w.terminate();



次のセクション

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <!-- web worker是运行在后台的javascript,不会影响页面的性能 --> <p>计数:<output id="result"></output></p> <button onclick="startWorker()">开始worker</button> <button onclick="endWorker()">停止worker</button> <br><br> <script type="text/javascript"> var w; function startWorker(){ if(typeof(Worker)!="undefined"){//浏览器支持web worker if(typeof(w)=="undefined"){//w是未定义的,还没有开始计数 w = new Worker("webworker.js");//创建一个Worker对象,利用Worker的构造函数 } //onmessage是Worker对象的properties w.onmessage = function(event){//事件处理函数,用来处理后端的web worker传递过来的消息 document.getElementById("result").innerHTML=event.data; }; }else{ document.getElementById("result").innerHTML="sorry,your browser does not support web workers"; } } function endWorker(){ w.terminate();//利用Worker对象的terminated方法,终止 w=undefined; } </script> <p>在后台运行的web worker js文件,webworker.js 才能实现效果<br> var i = 0; <br> function timeCount(){ <br> i = i + 1; <br> postMessage(i);//postMessage是Worker对象的方法,用于向html页面回传一段消息 <br> setTimeout("timeCount()",500);//定时任务 <br> } <br> timeCount();//加1计数,每500毫秒调用一次</p> </body> </html>
コースウェア