【问题标题】:Link promise to another将承诺链接到另一个
【发布时间】:2016-12-30 22:56:57
【问题描述】:

我正在阅读 scala.concurrent.impl.Promise 并且对“将 DefaultPromise 与另一个链接”的概念感到困惑。我了解“防止内存泄漏”部分,但不知道如何编写DefaultPromise 的当前状态为DefaultPromise 的示例。

DefaultPromise 首次创建时,它的状态是Nil,并且随着我们不断向其附加flatMap,列表会不断增长。什么情况下是分支

case dp: DefaultPromise[_] => dp.asInstanceOf[DefaultPromise[S]].linkRootOf(p)

Future.flatMap 中调用?

  test("default promise linking") {
    //f1.getState === Nil
    val f1 = Future {Thread.sleep(200000); 2}

    //f1.getState === List(CallbackRunner1)
    f1.flatMap(x => Future {Thread.sleep(200000); 4})
    //f1.getState === List(CallbackRunner2, CallbackRunner1)
    f1.flatMap(y => Future {Thread.sleep(200000); 3})

    Thread.sleep(30000000)
  }

【问题讨论】:

  • 可能是f1.flatMap(x => f1)?
  • @Bergi,但是如何理解 将承诺链接到另一个承诺,以便两个承诺共享相同的外部可见状态
  • Future {Thread.sleep(200000); 4} 返回一个DefaultPromise,对吧?
  • 是的,但是如何理解共享相同的外部可见状态

标签: scala promise future


【解决方案1】:

举个例子:

val f1 = Future {Thread.sleep(200000); 2}
val f2 = f1.flatMap(x => {
    val f3 = Future {Thread.sleep(200000); 4}
    f3
})

f1f3 当然不会共享相同的状态 - 一个用 2 解析,另一个用 4 解析。但是当 f1 完成时,处理程序 (f(v)) 将创建 f3 并且它将匹配您感到困惑的 the case。然后,f2p in flatMap)将链接到f3,以便它们共享相同的状态。

【讨论】:

  • 我在这里写了一篇文章:github.com/viktorklang/blog/blob/master/…
  • 您能否详细说明 ACPS 如何打破承诺链? ACPS 如何切断 flatMap 之间的联系?
  • @vincentchou:看来问题是当你使用 ACPS 时,你需要链接 flatMap,而不是 ACPS 是内存问题的解决方案。
  • @ViktorKlang 顺便说一句,对于任何对 Promise 实现感兴趣的人,您可能想看看 github.com/briancavalier/creed/pull/9。它采用了一种新方法来解决问题mentioned here 普通链接崩溃。
  • @Bergi 这是一个相当大的公关,有任何直接链接到魔术发生的地方吗? :)
猜你喜欢
  • 2013-11-25
  • 2019-05-10
  • 2015-05-07
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多