scala - Twitter Future 与 Scala Future 相比有哪些优势?

标签 scala twitter finagle twitter-finagle twitter-util

我知道 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)
    }
    
    oi保留它们的类型,它们不会被转换为最不常见的父类(super class)型 Any .
  • 保证按顺序执行一个 onSuccess 链:
    例如。:
    f.onSuccess { 
      println(1) // #1
    } onSuccess { 
      println(2) // #2
    }
    

  • #1 保证在 #2 之前执行
  • 线程模型有点不同。没有 ExecutionContext 的概念,在 Promise( future 的可变实现)中设置值的线程是执行 future 图中所有计算的线程。
    例如。:
    val f1 = new Promise[Int]
    f1.map(_ * 2).map(_ + 1)
    f1.setValue(2) // <- this thread also executes *2 and +1
    
  • 有一个中断/取消的概念。使用 Scala 的 Futures,信息只向一个方向流动,使用 Twitter 的 Futures,您可以通知生产者一些信息(不一定是取消)。实际上,它在 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+ 中实现(我相信)。
  • 关于scala - Twitter Future 与 Scala Future 相比有哪些优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32987855/

    相关文章:

    scala - 如何在Windows上从Maven和SBT获得彩色输出?

    scala - 与文件名中的冒号 ':' 作斗争

    scala - 如何在使用 git 库的 IntelliJ IDEA 中设置 scala 项目

    java - 列出的哪个 .jar 包含类 'com.twitter.finagle.stats.ExceptionStatsHandler' ?

    scala - 使用 scalamock 在 scala 中使用 ClassTag 的模拟方法

    scala - Spark Dataframe 除了方法问题

    python - 如何在 tweepy 的流 API 中使用 'count' 参数?

    android - 通过 Twitter 应用程序从 URL 分享图像 - Android

    r - 在 blogdown 帖子中嵌入推文

    scala - 在 Finagle 服务后应用过滤器