Pot.js 1.17 と PotLite.js 1.34 リリースしました。
Web Workers
バックグラウンド処理、並列処理ができる HTML5 API の Web Workers は、主要なブラウザですでに実装されています。
var worker = new Worker('child.js'); worker.onmessage = function(event) { alert(event.data); // 'hogefuga' がアラートされる }; worker.postMessage('hoge');child.js
onmessage = function(event) { postMessage(event.data + 'fuga'); };上のような感じで使うのですが、基本的に 'child.js' のようにファイル名を渡さないといけないんです。
なので JavaScript が 2 ファイルになります。
並列で 4 スレッドとか 6 スレッドとかしてたら どんどん増えてファイルの管理がめんどいです。
あと、ブラウザによって動作 (子Worker のスコープ) が若干異なっていて
せっかく並列処理がネイティブにできるのに、なかなか扱いにくいものになってしまってます。
そこで、ネイティブ Worker が利用できたら ネイティブで
なければ Worker エミュレータとして、
クロスブラウザに動作する Workeroid (Pot.Workeroid) を実装しました。
Pot.Workeroid
- 基本的にネイティブ Worker と同じに並列処理ができる
- ネイティブ Worker がなければエミュレートする
- クロスブラウザ
- 子 Worker スレッドで importScripts しなくても Pot.js が使える
- エミュレート時でも terminate で中断/終了できる
- ファイル名だけじゃなく関数オブジェクトを子 Workerとして渡せる
ネイティブの Worker は
子Worker プロセス内では 親 window のライブラリなどが使えません。
importScripts('hoge.js') で読み込まないと使えないのですが、
Pot.Workeroid はデフォルトで Pot.js が利用できます。
なので、Pot.Deferred.forEach などを利用して CPU 負荷を抑えた処理が可能です。
最大の特徴として、
コンストラクタに ファイル名のほか、関数を渡すことが可能なことです。
以下は function で Worker スレッドを生成する例です。
var worker = new Pot.Workeroid(function(data) {
//
// このスコープの中が 子Worker スレッド
//
var add = 1;
postMessage(data + add);
});
// メッセージを受信した時
worker.onmessage = function(data) {
alert(data);
};
// エラー時の設定 (任意)
worker.onerror = function(err) {
alert(err);
};
// 1 を 子 Worker に送信 => 2 が alert される
worker.postMessage(1);
色 をつけたスコープ内が 子 Worker として別スレッドになります。
子 Worker 空間内は、別ファイルに書いてる気持ちでコーディングするとわかりやすいかもです。
たくさんのスレッド作る場合でも、少しの短いコードでも 別ファイルにしなくて済みます。
これで楽に並列処理ができるとうれしい!
Pot.Workeroid の例を含む詳細は Pot.Workeroid リファレンス から参照できます。
あと、簡単な動作テストを jsFiddle に置いてあります。
更新したところ
- Pot.Workeroid 実装: Workeroid リファレンス
- 'just now' とか 'an hour ago' 表記の Pot.DateTime.prettyDate 実装
- Pot.tokenize と Pot.joinTokens などのトークナイザ系関数の実装
- あとちょっとした最適化とか
Pot.js / PotLite.js
Pot.js は CPU に負荷をかけることなく JavaScript の実行を可能とするユーティリティライブラリです。PotLite.js は Pot.js の非同期な部分だけを抽出したライトバージョンです。
ダウンロード
マニュアル
その他の情報についてはマニュアル/マニュアルからのリンク から参照ください。
レポジトリ
その他、なにか問題・バグ・感想・指摘などあれば、
コメントやメールまたは @polygon_planet まで送っていただけるとうれしいです。
0 件のコメント:
コメントを投稿