堆叠承诺是否会导致节点中出现内存韭葱?

在阅读this thread时,我开始怀疑自己的所作所为是否会导致内存泄漏:

以下代码将使我能够在代码库中的任何位置堆叠任务,并确保仅在完成所有先前任务之后才执行每个任务。

function task() {
  //dummy async treatment
  return delay(100);
}
let stack = Promise.resolve('the stack is empty');

function addTask() {
  return stack = stack.then(task);
}

在一段时间内(每秒)重复调用addTask时,是否会发生内存泄漏? 如果这样做,我应该如何解决?

非常感谢!

csl6868926 回答:堆叠承诺是否会导致节点中出现内存韭葱?

  

在一段时间内重复调用addTask时(每秒),会不会发生内存泄漏?如果这样做,我应该如何解决?

不。承诺链将允许对链中较早的已解决承诺进行垃圾收集,因此,只要您有一些时间可以进行垃圾收集,就不会有内存堆积。

referenced thread创建了一个条件,其中没有空闲时间,并且是一个无限循环,因此,如果JS引擎始终优先处理处理程序以获取可解决的Promise,而不是垃圾回收,则可能会占用大量内存。由于在大多数JS引擎中,服务已解决的Promise是一个非常高优先级的操作,因此当有一个Promise等待触发.then()处理程序时,如果某些JS引擎不进行任何垃圾回收,这也不会令我感到惊讶。

另一方面,您的任务处理程序不是无限循环,确实有一些时间可以进行垃圾回收(与大多数实际的异步操作一样)。

您应该意识到的一件事是,如果您要立即创建成千上万个此类任务,它将立即创建成千上万个Promise,这不是用于调度超大数的内存效率最高的机制的任务。例如,仅将它们存储在数组中,并在每次完成时从数组中选择下一个即可,这可能会提高内存效率,因为promise对象要比数组元素占用更多的内存。

另一方面,如果您要创建数十个甚至数百个任务,而一次队列中不会有成千上万个任务,那么您的方案将可以正常工作。一旦系统进行了一些垃圾回收,与现在完成的早期任务相关的已解决承诺将被垃圾回收。

本文链接:https://www.f2er.com/2983373.html

大家都在问