Firefox 3.1の新機能: Web Workersの派生スレッドでできること

杉山貴章(オングス)
2009-01-14 17:00:00
  • このエントリーをはてなブックマークに追加

Workerスレッドでできること

 Workerオブジェクトのコンストラクタに指定されたJavaScriptコードは、メインのスレッドとは異なるスレッド(便宜上、Workerスレッドと呼ぶ)で実行される。WorkerスレッドはWorkerScopeインタフェースで定義されるスコープを持つ。このスコープ内では、メインスレッドと全く同じようにしてJavaScriptを実行することができる。ただし、DOMを変更するようなスレッドセーフでない操作を行ってはいけない。

 WorkerScopeでは次のメソッドを利用することができる。

  • postMessage(): 派生元スレッドに対してメッセージを送る
  • importScripts(): 引数に指定されたURLのスクリプトをインポートする
  • setTimeout(): 第1引数に指定された関数を、第2引数に指定されたミリ秒後に実行する
  • setInterval(): 第1引数に指定された関数を、第2引数に指定されたミリ秒毎に繰り返し実行する
  • clearTimeout(): setTimeout()による設定をキャンセルする
  • clearInterval(): setInterval()による設定をキャンセルする

 postMessage()はWokerオブジェクトのもとの同様で、派生元スレッド(Workerのコンストラクタが実行されたスレッド)に対して文字列形式でデータを送ることができる。すなわち、postMessage()が実行されるとこのWorkerスレッドの元になったWorkerオブジェクトに対してmessageイベントが送られる。また、setTimeout()やsetInterval()などはwindowオブジェクトで使えるものと同様である。

 その他onmessageリスナも定義されており、これによって派生元スレッドでpostMessage()が実行された際に発生するmessageイベントを受け取ることができる。

 Workerスレッド内でWorkerオブジェクトを生成し、さらにスレッドを派生させることもできる。また、リスト1のようにしてXMLHttpRequestオブジェクトを生成することもできる。つまり、Web WorkerによってAjaxアプリケーションにおける通信処理を独立したスレッドで実行できるようになるわけである。Workerスレッド内で生成されたXMLHttpRequestオブジェクトは通常のXMLHttpRequestオブジェクトと同様の振る舞いをするが、responseXMLとchannelプロパティは常にnullを返すとのことだ。

リスト1 Workerスレッド内でXMLHttpRequest利用することも可能

var xhr = new XMLHttpRequest();
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]