两者之间的区别在于期货通常以计算为中心,而承诺以数据为中心。
看来你的理解相符这一点,但让我解释一下我的意思是:
在Scala和Clojure的期货的(除非通过某些其他功能/方法返回)有一些计算创建:
// scala
future { do_something() }
;; clojure
(future (do-something))
在这两种情况下,未来的“返回值”只有在计算结束后才能被读取(无阻塞)。当这种情况通常不在程序员的控制范围内时,计算会在后台的某个线程(池)中执行。
相反在这两种情况下承诺是最初为空的容器,其可以在以后被填充(正好一次):
// scala
val p = promise[Int]
...
p success 10 // or failure Exception()
;; clojure
(def p (promise))
(deliver p 10)
一旦这样它可以被读取的情况。
阅读期货和承诺是通过deref
在clojure(和realized?
可用于检查是否会阻止deref
)完成。在斯卡拉阅读是通过Future
特性提供的方法完成的。为了读取承诺的结果,我们必须获得一个实现Future的对象,这是通过p.future
完成的。现在如果特征Future
由Promise
执行,则p.future
可以返回this
并且两者相等。这纯粹是一种实现选择,不会改变概念。 所以你没有错! 在任何情况下,期货主要是使用回调进行处理。
在这一点或许值得重新考虑的两个概念的初步鉴定:
期货代表了计算在某个时刻会产生一个结果。让我们看看一个可能的实现:我们在某个线程(池)中运行代码,一旦完成,我们安排使用返回值来履行承诺。因此,读未来的结果就是读一个承诺;这是clojure的思维方式(不一定是实施)。
另一方面,一个承诺代表一个价值,将在某个时刻填补。当它被填充时,这意味着一些计算产生了结果。所以从某种意义上说,这就像未来的完成,所以我们应该以相同的方式使用回调来消费价值;这是斯卡拉的思维方式。
在clojure中,Future是一个在单独的线程中执行的函数,如果可用,可以引用一个句柄来访问返回值; clojure中的一个承诺是一个占位符,一旦某个值已经传递给它,它将无法取得变量。我不认为这些与scala有很大关系。 – noisesmith
因此,在编程语言中没有对未来和承诺构造进行一致的概念定义。 – nish1013
也许这将有助于http://stackoverflow.com/questions/13381134/what-are-use-cases-of-scala-promise/13388618#13388618 –