就像这个问题的作者一样,我试图理解 Scala 2.10 的期货和承诺中用户可见承诺的推理。
特别是,再次回到SIP 中的示例,它是否完全有缺陷:
import scala.concurrent.{ future, promise }
val p = promise[T]
val f = p.future
val producer = future {
val r = produceSomething()
p success r
continueDoingSomethingUnrelated()
}
val consumer = future {
startDoingSomething()
f onSuccess {
case r => doSomethingWithResult()
}
}
我在想象调用produceSomething
导致运行时异常的情况。因为 promise 和 producer-future 完全分离,这意味着系统挂起,消费者永远不会成功或失败。
因此,使用 Promise 的唯一安全方法需要类似
val producer = future {
try {
val r.produceSomething()
p success r
} catch {
case e: Throwable =>
p failure e
throw e // ouch
}
continueDoingSomethingUnrelated()
}
这显然容易出错且冗长。
对于可见的 Promise 类型,我能看到的唯一情况future {}
(不足之处)是 MAD 答案中的回调钩子之一。但是 SIP 的例子对我来说没有意义。