假设我有一个名为的 WebWorker 文件ticker.js
,其中包含以下内容:
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();
};
这会导致内存泄漏吗?
我认为不会,但我不确定。我的逻辑是 whilesometimesLongTask
有时需要一段时间(当 30 毫秒过去时),99% 的时间它会立即执行。因此,即使tick
每毫秒都会向 Javascript 的事件队列添加一个新的,但每隔一段时间,Javascript 可以加速所有这些并将它们清除,因为它们中的大多数不需要执行。真的是这样吗?
另外,我在这里甚至需要准备好标志,还是什么都不做(我可以摆脱它)?我认为它可能什么都不做,因为 Javascript 是单线程的,所以即使 WebWorker 可能会很快发布多条消息,Javascript 也不能同时运行多个实例sometimesLongTask
。正确的?
是的,这不会导致内存泄漏,因为根据定义,这意味着内存分配不会被释放,尽管不再需要。消息队列中的事件仍然需要,它们最终会被工作人员接收。
但是你甚至不会得到不断增长的内存使用量。这完全是由于prevTime
比较——我们可以假设所有排队的事件都可以在长任务运行之间的 30 毫秒内处理(不做任何事情)。
我什至需要
ready
这里的标志,还是什么都不做?
它确实没有任何用处。请注意,它始终是true
在执行处理程序时onmessage
。处理程序将永远不会中断您设置为的onmessage
同步。sometimesLongTask
false
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句