在一个长循环中调用Worker

时间:2015-10-21 07:16:47

标签: javascript web-worker

很抱歉,如果重复,但找​​不到我的确切情况。我正在玩Web Worker,非常有趣。我正在测试不同的情况并点击它。

主要:

var myWorker = new Worker("WK.js");

for (var i = 0; i <= 1000000000; i++) {
    myWorker.postMessage(i);
}

myWorker.onmessage = function (e) {
    alert(e.data);
}

工人:

var sum = 0;
        self.onmessage = function (e) {
        if (e.data == 1000000000) { postMessage("done" + sum); }
        sum += e.data;
    }

在工作者脚本上,我只是总结传递的值并在完成后回发总和。我遇到的问题是,上面的代码崩溃了我的浏览器(全部)这个数字(~1000000000)然而如果我将该循环移动到工作脚本,它工作正常。那么每个持续时间的postMessage调用数量是否有限制?请注意我知道这是错误的代码,只是为了测试。

2 个答案:

答案 0 :(得分:0)

您的浏览器可能没有崩溃。问题是你有一个稍后的循环,如果浏览器在主ui中执行。所以基本上浏览器忙于破坏你的代码,并且无法找到任何用户输入,即。它很忙,通常这导致没有响应&#39;在Windows中的消息。你不能在工作中得到这样的雨只是因为代码在一个完全独立的线程(非ui)中执行。

答案 1 :(得分:0)

这可能是内存/垃圾回收问题。你发布了十亿条消息,每条消息至少是一个整数的大小,我认为在Javascript中存储的所有其他数字都是8字节。忽略每条消息的任何额外开销,这意味着它需要分配至少8GB的内存。

我必须承认对垃圾收集器的无知程度,但它可能无法在短时间内使用8gb内存分配数十亿个对象。

  

每个持续时间的postMessage调用次数是否有限

我怀疑是的,虽然也许不清楚你的“持续时间”是什么意思。