我知道 Scala Future 变得更好的很多原因。有什么理由改用 Twitter Future 吗?除了 Finagle 使用它这一事实之外。
免责声明:我在 Twitter 负责 Future 的实施。一点背景知识,在 Scala 有一个“好的”实现之前我们就开始了自己的实现Future
.
Twitter 的功能如下Future
:
- 有些方法名称与 Twitter 的不同
Future
同伴中有一些新的辅助方法。
例如仅举一个例子:Future.join(f1, f2)
可以处理异构的 Future 类型。
Future.join(
Future.value(new Object), Future.value(1)
).map {
case (o: Object, i: Int) => println(o, i)
}
o
and i
保留它们的类型,它们不会被转换为最不常见的超类型Any
.
#1 保证在 #2 之前执行
-
线程模型有点不同。没有 ExecutionContext 的概念,在 Promise(Future 的可变实现)中设置值的线程是执行未来图中所有计算的线程。
例如。:
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+ 中实现了(我相信)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)