将 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
处理程序时,它始终为 true
。 onmessage
处理程序永远不会中断您的同步 sometimesLongTask
,在此期间它被设置为 false
。
假设我有一个名为 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
处理程序时,它始终为 true
。 onmessage
处理程序永远不会中断您的同步 sometimesLongTask
,在此期间它被设置为 false
。