是否会导致WebWorker向CPU密集型任务发送消息的内存泄漏?



假设我有一个名为ticker.js的WebWorker文件,它包含以下内容:

function tick() {
postMessage(1);
}
setInterval(tick, 1);

然后在JavaScript主程序中,我有这个:

let ready = true;
let prevTime = 0;
function sometimesLongTask() {
ready = false;
if (performance.now() - prevTime > 30) {
// a very long CPU intensive task, like a loop which takes a while to complete
prevTime = performance.now();
}
ready = true;
}
const intervalWorker = new Worker('ticker.js');
intervalWorker.onmessage = function() {
ready && sometimesLongTask();
};

这会导致内存泄漏吗?

认为不会,但我不确定。我的逻辑是,虽然sometimesLongTask有时需要一段时间(当30毫秒过去了),但99%的时间它会立即执行。因此,即使一个新的tick被添加到Javascript的事件队列每毫秒,每隔一段时间,Javascript可以加速通过所有这些并清除它们,因为它们中的大多数将不需要执行。事实果真如此吗?

另外,我甚至需要这里的ready标志,或者它什么都不做(我可以摆脱它)?我认为它可能什么都不做,因为Javascript是单线程的,所以即使WebWorker可能会很快发布多个消息,Javascript也不能同时运行sometimesLongTask的多个实例。正确吗?

是的,这不会导致内存泄漏,因为根据定义,这意味着即使不再需要,也不会释放内存分配。消息队列中的事件仍然是需要的,但是它们最终将被worker接收。

但是你甚至不会得到不断增长的内存使用。这仅仅是由于prevTime的比较——我们可以假设所有排队的事件都可以在长任务运行之间的30ms内处理(通过什么都不做)。

我甚至需要这里的ready标志,或者它什么都不做?

它确实没有什么有用的。注意,当执行onmessage处理程序时,它总是trueonmessage处理程序永远不会中断同步sometimesLongTask,在此期间它被设置为false

最新更新