Scala Future`.onComplete`函数在调用后被丢弃了吗?

时间:2019-06-30 03:15:25

标签: scala concurrent.futures

函数主体是否传递给Future.onComplete(),并在调用它们之后将其闭包,丢弃和垃圾回收?

我问是因为我正在编写Future实例的无限制序列。每个Future都有一个.onComplete { case Failure(t)...},它引用了先前Future中的先前已知有效值。我要避免的是,由于闭包主体中的引用,所有Future结果的总历史记录一直保存在JVM的内存中。

也许Scala比这更聪明,但是略读与执行上下文和期货相关的代码并不会带来很多收益。

谢谢。

1 个答案:

答案 0 :(得分:3)

通常实现Future且您要查看的类是DefaultPromise

它包含可变的状态,该状态会随着Future的完成而更新。

  • 如果您调用onComplete并且已经完成,那么它将立即计划您的回调并返回结果。回调未记录在任何地方。
  • 如果在结果尚不可用时调用onComplete,则回调将添加到“侦听器”列表中。
  • 当结果可用时(有人在诺言上调用complete),然后安排所有侦听器运行该结果,并删除侦听器列表(内部状态更改为“已完成此结果”) “)

这意味着您的回调链只会在“上游未来”不完整之前建立。之后,所有问题都会解决并进行垃圾回收。


上面的

“侦听器列表”有点简化。需要特别注意的是,这些侦听器不要最终互相引用,特别是要打破引用循环,以防止在递归构造期货时垃圾回收起作用。显然,这在早期版本中确实是一个问题。

  

通过自动破坏这些承诺链解决了泄漏问题,因此,承诺在长链中不会相互引用。这个     允许每个诺言被单独收集。这个想法是“扁平化”       承诺链,因此不是每个承诺都指向其承诺       邻居,他们直接将承诺指向了       链。这意味着仅引用了根承诺,而所有       如果没有其他承诺,就可以立即进行垃圾回收      不再被用户代码引用。