今回はWeb Workersを使って並列に素数を数えてみようと思います。
以下のデモでは 1000000000001から 1000000001000までの素数を、子Workerを4つ生成し、それらに仕事を等分して分け与えて計算させています。( ) 内は子WorkerのIDです。
申し訳ありませんが、今のところFirefoxのみでしか動きません。ChromeやSafariではWorker内でWorkerオブジェクトにアクセス出来ないのです。
デモ
http://etsukata.com/js/ww.html
Souce code
ww.js
worker.js
Web Workersを触ってみて、これは「ミニErlangだ」と感じました。Erlang程自由にWorker間でメッセージを自由にやりとり出来ないものの、非同期メッセージパッシングというパラダイムは共通です。
Web Workersは単に「ブラウザが固まらないようにバックグラウンドで処理するだけのもの」ではありません。将来的にはJavaScriptでのマルチコアプログラミングや分散コンピューティングに使われるのでないかと予想しています。だいぶ先(5年以上)のことと思いますが。もしかすると、現在ErlangがやっていることがWeb Workersを用いてJavaScriptで記述されるようになる日が来るかもしれません。未来的超高水準言語JavaScriptがErlangすら内包するかも、と嘯いてみます。
nodejs.orgにありがたいお言葉を見つけましたので以下に転載します。
The fundamentals of scalable systems are fast networking and non-blocking design—the rest is message passing. In future versions, Node will be able to fork new processes (using the Web Workers API ) which fits well into the current design.
仕様が定まっておらず、実装が錯綜しているので今のところはなんとも言えない感触です。
追記
Chromeがsubworkerをつくることが出来ない問題についてhidekiyさんにより情報頂きました。いつもお世話になります。Chromiumにissueが出ています。
http://code.google.com/p/chromium/issues/detail?id=50432
参考文献
Web Workers specification - WHATWG
http://www.whatwg.org/specs/web-workers/current-work/
The Basics of Web Workers - HTML5Rocks
Using web workers - MDC
https://developer.mozilla.org/En/Using_web_workers
WorkerがWorkerを作れない問題について
返信削除http://code.google.com/p/chromium/issues/detail?id=50432
HTML5Rocks - The Basics of Web Workers
http://www.html5rocks.com/tutorials/workers/basics/