JavaScriptで
マルチスレッドプログラミング
     @kabochha
   JavaScriptでマルチスレッド
    プログラミングをしたい
 JavaScriptでマルチスレッド
  プログラミングをしたい
 ってわけでWebWorkerを試し
  てみよう!と
 JavaScriptでマルチスレッド
  プログラミングをしたい
 ってわけでWebWorkerを試し
  てみよう!と
 思ったんですが…
Web Workersとは

   高負荷な計算処理などをUI以外のス
    レッドで実行するための機能
Web Workersとは

 高負荷な計算処理などをUI以外のス
  レッドで実行するための機能
 独立したスレッドなので、UI側のメ
  モリやCPUリソースに影響せずにタ
  スクを実行できる
Web Workerでできること
 navigatorオブジェクト
 locationオブジェクト(読み取り専用)
 XMLHttpRequest関数(Ajax)
 アプリケーションキャッシュ
 importScriptsを使ったJSONP
 その他のWeb Workersの生成
 下記windowオブジェクト
 バイナリデータとBase64ASCⅡを相互変換する
  atob(),bota()にsetTimeout()、clearTimeout()、
  setInterval()、clearInterval()、dump()
できないこと

windowオブジェクト
documentオブジェクト
parentオブジェクト
使いどころ
 大きなJSONや文字列の処理
 Canvasなどでのフィルタリング処理
 動画や音声の解析、処理
 複雑な計算(暗号化、3Dポジショニ
  ング、素数計算など)
 データの先読み、キャッシュ
 スペルチェックなどの構文解析
 IndexedDBを用いたデータ処理
ブラウザ対応度




http://caniuse.com
ブラウザ対応度 shared worker




http://caniuse.com
スマートフォンだと
 mobile Safariは5.0から
 Android Browerは2.1のみ
 Andorid Chromeは専有ワーカーのみ
  対応
スマートフォンだと
 mobile Safariは5.0から
 Android Browerは2.1のみ
 mobile Chromeは専有ワーカーのみ対
  応


というわけで現状だと使い
    にくい
Web Workersの種類


専用ワーカー
インラインワーカー
共有ワーカー
専用ワーカー


   自分自身を起動したスクリプトとの
    み通信できる
使い方
1.   Workerコンストラクタを呼び出す
2.   Web workersが送ってくるメッセー
     ジを受け取るメソッド(onmessage)
     を用意
3.   Workerの開始(postMessage)
4.   Web Worker側でもonmessageと
     postMessageを用意する
メインスクリプト
//Workerの生成
var worker = new Worker('work.js');

//Web Workerからのメッセージ受信用メソッド
worker.onmessage = function(e) {
 console.log(e.data);//return Worker Started
 };

// Worker スタート
worker.postMessage('Worker Started’);
Worker素クリプト

//メインスクリプトからのメッセージ受信用
メソッド
onmessage = function(e){

//メインスクリプト側にメッセージを送る
 postMessage(“return : “ + e.data);
 };
インラインワーカー

 動的にWorkerを生成したい
 Ⅰ枚のHTMLファイルで済ませたい
 Chromeの拡張機能としてバンドルし
  たい
使い方

1.   BlobBuilderとcreateObjectURLを
     使ってWorker用ファイルを構築する
2.   1を使ってWorkerオブジェクトを生
     成する
3.   ごにょごにょする
//worker用のスクリプト生成
var str = "onmessage = function(e) { postMessage(‘return ’ +e.data); }”;

//blobオブジェクト生成
var blob = new Blob([str], {type:"text/javascript"});

//createObjectURLをChromeでもFirefoxでも使えるように
var myUrl = window.webkitURL || window.URL;

//ファイル生成
var blobURL = myUrl.createObjectURL(blob);

var worker = new Worker(blobURL);
worker.onmessage = function(e) {
   console.log(e.data); // return Worker Started
};
worker.postMessage('Worker Started');
共有ワーカー

 ユーザー認証や接続状況をⅠヶ所に
  まとめて参照できる
 別window間のデータの一貫性を保証
  する
   モデルをⅠつの場所に集めることが
    できる
使い方

 new SharedWorkerで生成
 SharedWorker側はonmeaageではなく
  onconnectでメッセージ受信
 EventLisntenerを使う場合、start()を
  呼んでWorkerで始める
メインスクリプト
//共有ワーカーを生成
var worker = new SharedWorker("sworker.js");

worker.port.onmessage = function(e){
    console.log(e.data);// ports = xx
};

//共有ワーカーにメッセージ送信
Worker.port.postMessage();
Workerスクリプト
//コネクション数のカウント
var connect = 0;

//受信メソッド
onconnect = function(e){
connection++;

e.ports[0].postMessage("ports = " + connection);
}
Parallel.js
以上です
ご清聴ありがとうございました

Web Workers