Web Workers

JavaScript初心者の私ですが、Web Workersで遊んでいます。https://developer.mozilla.org/en-US/docs/DOM/Using_web_workers や他のページを見ても、Workerそのものは"transient"なものであって、一度生成したら一度走らせて終了したらさようならして、というモデルが推奨(?)されているようです。コードを書き直すたびにページをリロードしている場合には違いはわかりませんが、Livelyのような環境では同じWorkerを保持しておいて何度も使えるわけですし、私がやりたいと思っている対話的なMonte Carlo シミュレーションでもそういう使い方ができてほしいわけです。

まあ話は簡単で、

postMessage("xyz")

calc = (function() {
    var register = 0
    return function() {return register++}
    })()

onmessage = function (evt) {
    var result = calc()
    postMessage("result: " + result)
}

というようなWorker用のコードを書いておけば、Workspaceで

myWorker = new Worker("PlayerWorker.js")
myWorker.onmessage = function(evt) {
    console.log(evt.data.toString())
}
myWorker.postMessage("")

というコードを実行できます。面白いのは、こちらのコードをひとまとめにして実行する(全選択してCmd-dを押す)と、Worker側のpostMessage("xyz")が実行されるときにはすでにクライアント側の"myWorker.onmessage() = ..."が実行されているので"xyz"がコンソールに出力されますが、各行を別々に実行したときにはそうはならないということでしょうか。もちろんもう一つの面白い点は、最後の"myWorker.postMessage("")を繰り返しCmd-dすると、結果はちゃんと

result: 0
result: 1
result: 2
result: 3
result: 4
...

のように情報が記憶されている、というところでしょうか。大昔にLively Kernelのメーリングリストで話題になっていたhttps://github.com/eligrey/jsandbox でも結局はできていたことではあるでしょうが、まあ初心者にはそれでも発見です。