未来和承诺之间有什么区别?(在Akka和Gpars中。)
在我看来,它们既相同,又阻塞并且在调用get时返回future的值,并且承诺将获得future的结果。
未来和承诺之间有什么区别?(在Akka和Gpars中。)
在我看来,它们既相同,又阻塞并且在调用get时返回future的值,并且承诺将获得future的结果。
Answers:
我将谈论Akka / Scala,因为我对Gpars和Akka / Java都不熟悉。
在Scala 2.10中,它包括标准发行版中Akka的相关部分,a Future
本质上是对尚未计算值的只读引用。A Promise
几乎相同,除了您也可以写它。换句话说,您可以同时读取Future
s和Promise
s,但只能写入Promise
s。您可以通过在方法上调用方法来获得Future
与a 的关联,但是无法在另一个方向进行转换(因为这将是毫无意义的)。Promise
future
根据维基百科,它们是相同的概念:
在计算机科学中,future,promise和delay是指用于在某些并行编程语言中进行同步的结构。他们描述了一个对象,该对象充当最初未知的结果的代理,通常是因为其值的计算尚未完成。
一些库可能选择以一种方式调用它们,一些库可能选择以另一种方式调用它们。而且每次都可以用不同的方式实现它们。一些图书馆可能选择使用这些同义词来区分不同的口味。尽管我会认为这是一个错误的选择(因为这显然使人感到困惑),但此链接表明在Scala中,这是常见的做法。
正如@Ptharien的Flame建议的那样,在Scala中,a Future
是只读操作,而a Promise
使您能够为其表示的操作产生结果(或失败)。
Promise
因此,负责执行该操作以传播结果的代码最好使用A ,而将a Future
暴露给客户端代码使用这将依次等待结果。但是,请再次注意,这种区别是Scala特有的,可能会使外部人员感到困惑。
我将在这里添加一些内容,因为最近我一直在使用大量的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中,编写回调,并从控制器中将其返回。
因此,正如我在教书时告诉人们的那样,“承诺和未来”或多或少是同义词。