読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

Worker

Workerに置いたWorkerの使用例について。

<!doctype html> 
<html> 
  <head> 
    <title>Worker</title> 
    <style> 
    pre {
      white-space: pre-wrap;
    }
    </style> 
    <script>window.onload = function () {
      var view = document.getElementById("view");
      var worker = new Worker("pi.js");
      worker.onmessage = function (ev) {
        view.textContent = Number(ev.data).toFixed(20);
      };
    };</script> 
  </head> 
  <body> 
    <pre id="view"></pre> 
  </body> 
</html> 

まず、new Worker("script-url.js")でthreadで動かすスクリプトファイルのURLを指定し、Workerのインスタンスでmessageイベントをlistenするだけ。Workerとのやり取りは全てmessageイベントを経由して行う。workerにmessageイベントを投げるのはWorker#postMessageで、文字列のみ渡すことができる。逆にworkerから本スレッドにmessageイベントを投げるのは、Workerスレッド内のグローバル関数postMessage。

var result = 0;
for (var i = 1;; i += 4) {
  postMessage(result * 4);
  result += 1/i - 1/(i + 2);
}

setTimeoutを挟んでいないがUIをブロックしないというのが利点。

worker使っていたとしても、無限ループはさすがに重くなるので、この場合はsetTimeoutを挟んだりする必要があるようだ。sleepが欲しい。ちなみに、workerを使わないようにしたコードは下記で、worker使うより短くなった。

(function fun(result, i) {
  view.textContent = result * 4;
  setTimeout(function () {
    fun(result + 1/i - 1/(i + 2), i + 4);
  }, 0);
})(0, 1);