将 WebWorker postMessage 发送到 CPU 密集型任务是否会导致内存泄漏?

Does it cause a memory leak for a WebWorker to postMessage to CPU intensive tasks?

假设我有一个名为 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% 的时间它会立即执行。因此,即使每毫秒向 Javascript 的事件队列中添加一个新的 tick,每隔一段时间 Javascript 就可以加速所有这些并将它们清除,因为大多数其中不需要执行。真的是这样吗?

此外,我什至需要这里的就绪标志,还是什么都不做(我可以摆脱它)?我认为它可能什么都不做,因为 Javascript 是单线程的,所以即使 WebWorker 可能 post 非常快地发送多条消息,Javascript 也不能 运行 [=] 的多个实例14=] 同时。正确吗?

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

但是您甚至不会增加内存使用量。这完全是由于 prevTime 比较 - 我们可以假设所有排队的事件都可以在长任务运行之间的 30 毫秒内处理(什么都不做)。

Do I even need the ready flag here, or is it doing nothing?

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