Twitter未来优于Scala Future的优势是什么?

时间:2015-10-07 08:53:14

标签: scala twitter finagle twitter-finagle twitter-util

我知道Scala Future更好的原因很多。是否有任何理由使用Twitter Future?除了Finagle使用它之外。

2 个答案:

答案 0 :(得分:18)

免责声明:我在Twitter上就Future的实施工作。在一点上下文中,我们在Scala实现Future的“良好”实现之前就开始了我们自己的实现。

以下是Twitter的Future

的功能
  • 某些方法名称不同,Twitter的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)
}

oi保留其类型,但不会将其转换为最不常见的超类型Any

  • 保证onSuccess链按顺序执行: 例如:

    f.onSuccess { 
      println(1) // #1
    } onSuccess { 
      println(2) // #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生成它的链。但如果我理解正确,这个想法就会被抛弃。