两者的区别在于,future 通常以计算为中心,而 promise 以数据为中心。
您的理解似乎与此相符,但让我解释一下我的意思:
在 scala 和 clojure中, futures(除非由其他函数/方法返回)是通过一些计算创建的:
// scala
future { do_something() }
;; clojure
(future (do-something))
在这两种情况下,只有在计算终止后才能读取(没有阻塞)未来的“返回值”。这种情况通常不在程序员的控制范围内,因为计算是在后台的某个线程(池)中执行的。
相反,在这两种情况下,promise最初都是一个空容器,稍后可以填充(恰好一次):
// scala
val p = promise[Int]
...
p success 10 // or failure Exception()
;; clojure
(def p (promise))
(deliver p 10)
一旦出现这种情况,它就可以被读取。
读取 futures 和 promises 是deref
在 clojure 中完成的(并且realized?
可以用来检查是否deref
会阻塞)。在 Scala 中,阅读是通过Future
trait 提供的方法完成的。为了读取 promise 的结果,我们必须获得一个实现 Future 的对象,这是由p.future
. 现在如果 traitFuture
由 a 实现Promise
,则p.future
可以返回this
并且两者相等。这纯粹是一种实现选择,不会改变概念。所以你没有错!
在任何情况下,Futures 主要使用回调来处理。
在这一点上,重新考虑这两个概念的初始特征可能是值得的:
期货表示将在某个时刻产生结果的计算。让我们看一个可能的实现:我们在某个线程(池)中运行代码,一旦完成,我们安排使用返回值来履行承诺。所以阅读未来的结果就是阅读一个承诺;这是clojure的思维方式(不一定是实现)。
另一方面,promise 表示将在某个时候填充的值。当它被填满时,这意味着一些计算产生了一个结果。所以在某种程度上这就像一个未来的完成,所以我们应该以同样的方式使用这个值,使用回调;这是斯卡拉的思维方式。