HTML入門 | HTML5 API | Web Worker

Web Worker API

Webページでスクリプトが実行されると、そのスクリプトが終了するまでWebページは応答できない状態になる。 Web Workerは、スクリプトがWebページの性能に影響しないようにバックグラウンドで動作するJavaScriptである。

つまり、Web Workerはスクリプトのマルチスレッドをサポートする。 そのため、ユーザーがWebページを利用しながら、時間のかかるJavaScript処理も同時に実行できる。

Web Workerをサポートする主なWebブラウザーのバージョンは次のとおりである。

API ie chrome firefox safari opera
web worker 10.0 4.0 3.5 4.0 11.5

Web Workerのサポート確認

Web Workerを使う前に、まずユーザーのWebブラウザーがこれをサポートしているか確認する必要がある。

構文

if (typeof(Worker) !== "undefined") {
    // Web Worker用のコード
} else {
    // Web Workerをサポートしないブラウザー向けの案内
}

Web Workerファイルの作成

Web Workerの動作を確認するため、素数を探す外部JavaScriptファイルを作成する。

var n = 1;
search: while (true) {
    n += 1;
    for (var i = 2; i <= Math.sqrt(n); i += 1)
        if (n % i == 0)
            continue search;
        postMessage(n);
}

上の例でpostMessage()メソッドは、HTML文書に結果を渡すために使われる。

Web Workerオブジェクトの作成

上で作成したWeb Workerファイルを読み込むHTMLファイルを作成する。

if(typeof(webworker) == "undefined") {
    webworker = new Worker("/examples/web_worker.js");
}

上の例は、Web Workerファイルが存在しない場合に新しいWeb Workerオブジェクトを作成する。

workerオブジェクトとの接続

onmessageイベントリスナーを通じて、Web Workerファイルとメッセージをやり取りできる。

webworker.onmessage = function(event) {
    document.getElementById("result").innerHTML = event.data;
};

上の例では、Web Workerファイルがメッセージを送ると該当するイベントリスナーが実行される。 このとき、Web Workerファイルが送った情報はevent.dataに保存される。

Web Workerオブジェクトの終了

Web Workerオブジェクトは作成されると、終了するまでメッセージを受け取る準備を続ける。 そのため、Webブラウザーやコンピューターのリソースを返すには、terminate()メソッドでWeb Workerを必ず終了する必要がある。

webworker.terminate();

Web Workerオブジェクトの再利用

Web Workerオブジェクトを終了した後は、Web Workerの値をundefinedに設定してから再利用する。

webworker = undefined;

Web Workerの例

次の例は、ここまで見たWeb Workerの動作を1つの例として示す。

var webworker;
function startWorker() {
    if(typeof(Worker) !== "undefined") {
        if(typeof(webworker) == "undefined") { webworker = new Worker("/examples/web_worker.js"); }
        webworker.onmessage = function(event) { document.getElementById("result").innerHTML = event.data; }; 
    }
}
function stopWorker() { 
    webworker.terminate();
    webworker = undefined;
}