2010/11/17

WebWorkersを使ってJavaScript並列素数計算

Web Workersはページ内でバックグラウンドで並列にスクリプトを実行するための機能です。メッセージパッシングでスレッドのような操作ができます。これを用いることにより、例えばJavaScriptで非常に時間のかかる処理をする際、ブラウザが固まってしまう状況を避けることができます。
今回は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

1 件のコメント:

  1. 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/

    返信削除