gpt4 book ai didi

javascript - 如何循环 Web Worker?

转载 作者:行者123 更新时间:2023-12-03 01:58:31 26 4
gpt4 key购买 nike

我正在制作一个网站,用户可以使用 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

我该如何解决这个问题,我想让工作人员为每个工作(或直到用户关闭页面)工作

编辑:需要明确的是,我上面发布的代码有效!但当我将 setTimeout("calculate()", 1); 替换为 calculate();

时,它停止工作

最佳答案

工作线程的优点是它们允许您将繁重的处理从主线程中移出。如果您从代码中删除 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();

关于javascript - 如何循环 Web Worker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50138981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com