我知道Scala Future更好的原因很多。是否有任何理由使用Twitter Future?除了Finagle使用它之外。
答案 0 :(得分:18)
免责声明:我在Twitter上就Future的实施工作。在一点上下文中,我们在Scala实现Future
的“良好”实现之前就开始了我们自己的实现。
以下是Twitter的Future
:
Future
在随播广告中有一些新的帮助方法。 e.g。举个例子:Future.join(f1, f2)
可以处理异构的Future类型。
Future.join(
Future.value(new Object), Future.value(1)
).map {
case (o: Object, i: Int) => println(o, i)
}
o
和i
保留其类型,但不会将其转换为最不常见的超类型Any
。
保证onSuccess链按顺序执行: 例如:
f.onSuccess {
println(1) // #1
} onSuccess {
println(2) // #2
}
#1
线程模型略有不同。没有ExecutionContext的概念,在Promise(Future的可变实现)中设置值的Thread是在将来的图中执行所有计算的。 e.g:
val f1 = new Promise[Int]
f1.map(_ * 2).map(_ + 1)
f1.setValue(2) // <- this thread also executes *2 and +1
有一个中断/取消的概念。使用Scala的Futures,信息只向一个方向流动,通过Twitter的Future,您可以向生产者通知一些信息(不一定是取消)。在实践中,它在Finagle中用于传播RPC的取消。因为Finagle还通过网络宣传取消,并且由于Twitter有大量粉丝请求,这实际上节省了大量工作。
class MyMessage extends Exception
val p = new Promise[Int]
p.setInterruptHandler {
case ex: MyMessage => println("Receive MyMessage")
}
val f = p.map(_ + 1).map(_ * 2)
f.raise(new MyMessage) // print "Receive MyMessage"
直到最近,Twitter的Future才是唯一一个实现高效尾递归的人(即你可以拥有一个自我调用的递归函数而不会炸掉你的调用堆栈)。它已在Scala 2.11+中实现(我相信)。
答案 1 :(得分:2)
据我所知,可能有利于使用Twitter Future
的主要区别在于它可以取消,与scala的Future
不同。
此外,曾经有一些支持跟踪调用链(因为你可能知道使用Futures时普通堆栈跟踪几乎没用)。换句话说,您可以采用未来并告诉map
/ flatMap
生成它的链。但如果我理解正确,这个想法就会被抛弃。