如何循环 Web Worker?
How to loop a Web Worker?
我正在制作一个网站,其中使用 PHP、AJAX 和 Javascript 用户可以帮助计算 PI,这纯粹是为了学习目的,我知道那里是计算 PI 的更有效方法。
我需要选择一个随机位置,然后查看它是否在一个圆圈中,因为我创建了这个代码
var size = 500;
function calculate() {
var Xpos = Math.floor(Math.random() * size);
var Ypos = Math.floor(Math.random() * size);
var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);
if (dist <= size / 2) postMessage(true);
else postMessage(false);
setTimeout("calculate()", 1);
}
calculate();
效果很好,虽然它可能会更快,因为那里有一个不需要的超时(我认为它无论如何都不需要),所以如果我只是删除它并只用 calculate();
替换它以加快它我收到此错误
Uncaught RangeError: Maximum call stack size exceeded
我该如何解决这个问题,我想让工作人员为每个(或直到用户关闭页面)工作
编辑:
需要说明的是,我上面发布的代码有效!但是当我用 calculate();
替换 setTimeout("calculate()", 1);
时它停止工作
workers 的优势在于它们允许您从主线程中转移繁重的处理。如果您从代码中删除 setTimeout
,您仍将向主线程发送大量处理,不再用于计算 PI,但仍用于处理工作消息。
因此,我们的想法是在将消息发送到主线程之前尽可能长时间地处理。例如,在您的应用程序中,您可以 运行 多次迭代并在一条消息中发送结果:
const size = 500;
function calculate() {
const iterations = 100000;
while (true) { // you will probably want to have a condition to stop
let inside = 0;
for (let i = 0; i < iterations; i++) {
var Xpos = Math.floor(Math.random() * size);
var Ypos = Math.floor(Math.random() * size);
var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);
if (dist <= size / 2) {
inside++;
}
}
postMessage({iterations, inside});
}
}
calculate();
setTimeout([func],delay)
等待定义的延迟量,然后调用函数一次并停止,因此一遍又一遍地调用它会立即溢出堆栈,因为没有间隙可以释放资源。
和
无限 while 循环将冻结页面
并且由于您希望在页面处于活动状态时成为 运行,因此您需要使用 setInterval
,它会经常调用该函数(您的 dely),直到您关闭页面.
var size = 500;
setInterval(function() {
var Xpos = Math.floor(Math.random() * size);
var Ypos = Math.floor(Math.random() * size);
var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);
if (dist <= size / 2) postMessage(true);
else postMessage(false);
}, 1);
我正在制作一个网站,其中使用 PHP、AJAX 和 Javascript 用户可以帮助计算 PI,这纯粹是为了学习目的,我知道那里是计算 PI 的更有效方法。
我需要选择一个随机位置,然后查看它是否在一个圆圈中,因为我创建了这个代码
var size = 500;
function calculate() {
var Xpos = Math.floor(Math.random() * size);
var Ypos = Math.floor(Math.random() * size);
var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);
if (dist <= size / 2) postMessage(true);
else postMessage(false);
setTimeout("calculate()", 1);
}
calculate();
效果很好,虽然它可能会更快,因为那里有一个不需要的超时(我认为它无论如何都不需要),所以如果我只是删除它并只用 calculate();
替换它以加快它我收到此错误
Uncaught RangeError: Maximum call stack size exceeded
我该如何解决这个问题,我想让工作人员为每个(或直到用户关闭页面)工作
编辑:
需要说明的是,我上面发布的代码有效!但是当我用 calculate();
setTimeout("calculate()", 1);
时它停止工作
workers 的优势在于它们允许您从主线程中转移繁重的处理。如果您从代码中删除 setTimeout
,您仍将向主线程发送大量处理,不再用于计算 PI,但仍用于处理工作消息。
因此,我们的想法是在将消息发送到主线程之前尽可能长时间地处理。例如,在您的应用程序中,您可以 运行 多次迭代并在一条消息中发送结果:
const size = 500;
function calculate() {
const iterations = 100000;
while (true) { // you will probably want to have a condition to stop
let inside = 0;
for (let i = 0; i < iterations; i++) {
var Xpos = Math.floor(Math.random() * size);
var Ypos = Math.floor(Math.random() * size);
var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);
if (dist <= size / 2) {
inside++;
}
}
postMessage({iterations, inside});
}
}
calculate();
setTimeout([func],delay)
等待定义的延迟量,然后调用函数一次并停止,因此一遍又一遍地调用它会立即溢出堆栈,因为没有间隙可以释放资源。
和
无限 while 循环将冻结页面
并且由于您希望在页面处于活动状态时成为 运行,因此您需要使用 setInterval
,它会经常调用该函数(您的 dely),直到您关闭页面.
var size = 500;
setInterval(function() {
var Xpos = Math.floor(Math.random() * size);
var Ypos = Math.floor(Math.random() * size);
var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);
if (dist <= size / 2) postMessage(true);
else postMessage(false);
}, 1);