我正在使用以下代码来运行 webworker,以在最新的 Google Chrome 中对网页中的素数进行计算
https://dl.dropbox.com/u/655237/project/prime.html
但是单击启动 Worker 按钮后,停止按钮会在一段时间内无响应。大约 30 秒后,当鼠标悬停时它会变为事件状态。这在 Firefox 中不会发生。
代码有什么缺陷吗?
prime.html
<section>
Last Prime Found:- <p id="number">NA</p>
<button id="prime">Find Prime</button>
<button id="primew">Start Worker</button>
<button id="primes">Stop Worker</button>
</section>
<script>
var worker;
document.querySelector('#prime').addEventListener('click', function () {
findPrime();
}, false);
document.querySelector('#primew').addEventListener('click', function () {
findPrimeW();
}, false);
document.querySelector('#primes').addEventListener('click', function () {
stopWorker();
}, false);
function findPrime(){
var n = 1;
search: while (true) {
n += 1;
for (var i = 2; i <= Math.sqrt(n); i += 1)
if (n % i == 0)
continue search;
// found a prime!
document.querySelector("#number").textContent=n;
}
}
function findPrimeW(){
worker = new Worker('js/worker1.js');
worker.onmessage = function (event) {
document.querySelector("#number").textContent = event.data;
};
}
function stopWorker()
{
worker.terminate();
}
</script>
worker1.js
var n = 1;
search: while (true) {
n += 1;
for (var i = 2; i <= Math.sqrt(n); i += 1)
if (n % i == 0)
continue search;
// found a prime!
postMessage(n);
}
另一个例子是这样的 https://dl.dropbox.com/u/655237/events/gdg-html5/index.html#/webworkers
点击“启动Worker”按钮后一段时间内无法更改幻灯片。理想情况下,这种情况不应该发生,因为重量级计算被委托(delegate)给单独的网络 worker 。
最佳答案
我相信此对话与此相关:https://code.google.com/p/chromium/issues/detail?id=85686
亲自尝试后,LatinSuD's comment看来是对的:
I think I have an explanation. There is too much communication between worker and main page. I modified the worker to only report one prime number each 1000, and it works smooth. Kind of "prime numbers density is too high in the first millions".
关于javascript - 运行 HTML5 Web Worker 时 Google Chrome 无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13170828/