未来与承诺之间有什么区别?


73

未来和承诺之间有什么区别?(在Akka和Gpars中。)

在我看来,它们既相同,又阻塞并且在调用get时返回future的值,并且承诺将获得future的结果。


4
“未来承诺生产者消费者”。(但是对于编程,请交换最后两个,因为Future(零个或多个)类似于值的消耗,而Promise(只有第一个可以成功)类似于产生值。)
rwong

马丁·奥德斯基,埃里克·梅耶尔,罗兰·库恩撰写的关于“响应式编程原理”课程的关于未来/前景的精彩演讲:class.coursera.org/reactive-001/lecture,第3周
GKislin 2014年

@rwong:“未来承诺生产者消费者”-是吗?这是否意味着要成为一个有意义的句子,用作助记符,以提醒我们期货和承诺之间的区别?我的大脑完全无法解析它。而且,您说的是错误的,需要交换单词,但是由于某种原因,您在输入之前并没有做到这一点。最后,它用引号引起来,但是在谷歌上搜索它只会引起您的评论。超级困惑。
bacar

Answers:


54

我将谈论Akka / Scala,因为我对Gpars和Akka / Java都不熟悉。

在Scala 2.10中,它包括标准发行版中Akka的相关部分,a Future本质上是对尚未计算值的只读引用。A Promise几乎相同,除了您也可以写它。换句话说,您可以同时读取Futures和Promises,但只能写入Promises。您可以通过在方法上调用方法来获得Future与a 的关联,但是无法在另一个方向进行转换(因为这将是毫无意义的)。Promisefuture



19

根据维基百科,它们是相同的概念:

在计算机科学中,future,promise和delay是指用于在某些并行编程语言中进行同步的结构。他们描述了一个对象,该对象充当最初未知的结果的代理,通常是因为其值的计算尚未完成。

一些库可能选择以一种方式调用它们,一些库可能选择以另一种方式调用它们。而且每次都可以用不同的方式实现它们。一些图书馆可能选择使用这些同义词来区分不同的口味。尽管我会认为这是一个错误的选择(因为这显然使人感到困惑),但此链接表明在Scala中,这是常见的做法。

正如@Ptharien的Flame建议的那样,在Scala中,a Future是只读操作,而a Promise使您能够为其表示的操作产生结果(或失败)。

Promise因此,负责执行该操作以传播结果的代码最好使用A ,而将a Future暴露给客户端代码使用这将依次等待结果。但是,请再次注意,这种区别是Scala特有的,可能会使外部人员感到困惑。


JS Promises和Python Futures也是如此。
Nick Sweeting

6

我将在这里添加一些内容,因为最近我一直在使用大量的Java期货,但是也有Scala / Akka开发的背景。这个答案将大体上重复已经说过的话,但会指出当今在JVM上广泛使用的许多实现。

首先,原始发帖人提到使用get和block-永远不要在测试之外这样做。

当我以当前职位教授FP和并发性概念时,我首先告诉学生语义承诺和期货是同义词,因为作为promise或future api的使用者,开发人员不需要了解是否存在或是否存在语义上的差异-仅在不阻塞IO的情况下处理它们的机制。

要说一个未来不能完成,一个承诺可以(例如,按照scala / akka / play apis)是太简单了:

一些 将来可以完成的 Java8现在将CompletableFuture引入了标准库。

某些承诺无法完成 类似地,在Play promise API中无法实现Promise,但是RedeemablePromise可以使play引入不同的语义-即使处于Typesafe保护之下。此外,Play Promise API可以双向转换Scala期货-(F.Promise.wrap(future)或promise.wrapped())。

在Java8上使用Typesafe技术,您经常会在期货/承诺之间来回切换,这仅仅是因为一个API更可取(对于Java8 lambda,Play Promise API似乎更好)。在Akka + Play + Java8上,您将从Actor手中获取期货,并将其包装到promise中,编写回调,并从控制器中将其返回。

因此,正如我在教书时告诉人们的那样,“承诺和未来”或多或少是同义词。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.