初めてのWebWorkers
新年のやる気のあるうちにやっておこうと思い、WebWorkersを試してみたのです。
jsdo.itでファイルアップロード機能があったので、そこでやろうかと思ったら画像とか
マルチメディア系のファイルでないとアップロードできないみたいで……
仕方なしにローカル環境で試したのでした。
環境:MacOS 10.7.2 64bit / Google Chrome 17.0.963.12 dev
mongoose httpd
お手軽httpdであるmongooseをダウンロードしてきます。
Google Code Archive - Long-term storage for Google Code Project Hosting.
Windowsだとexeをダウンロードするだけなのでコンパイル作業は必要なく、これまたラクチンです。
今回はMacなのでmongoose-3.0.tgzをダウンロードしてきます。
その後は展開、コンパイルを以下の要領でします。
$ mv ~/Downloads/mongoose-3.0.tgz {作業フォルダ} $ cd {作業フォルダ} $ tar xvfz mongoose-3.0.tgz $ cd mongoose/ $ make mac
ついでにhttpdの実行を。
$ ./mongoose -d no -i index.html -r ../
index.html / worker.js
作業フォルダにindex.htmlという名前で以下を保存します。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>初めてのWebWorkers</title> </head> <body> <script> (function(){ var MAX_SIN = 30, w = new Worker('worker.js'); // w.onmessage = function(event) { ... }; w.addEventListener('message', function(event){ document.write( // event.data === result JSON.parse(event.data).join('<br>') ); }, false); w.postMessage(MAX_SIN); }()); </script> </body> </html>
同じく作業フォルダにworker.jsという名前で以下を保存します。
onmessage = function(event) { // event.data === MAX_SIN var i, result = []; for (i = event.data; i >= 0; i -= 1) { result[i] = Math.sin(i); } postMessage(JSON.stringify(result)); };
あとはWebWorkersに対応しているブラウザでhttp://localhost:8080/を見ると、
sin(0..30)までが表示されているはず。
postMessageするときにJSONにしていますが、確か最近のブラウザだとオブジェクトとかも渡せるとかなんとか。
なのでわざわざJSONにする必要もないかと思います。……初期?は文字列だけ、って制約が確かあったような。
でもこれだとWebWorkersが動作しているらしい、ということはわかっても
CPU負荷が分散されてるかどうかわからない……
なのでもうちょっとコードを変更する必要があります。が、それは次回にでも……(次回があるのか?)
あとSharedWorkerも使ってみないと……