Каковы преимущества будущего Twitterа в будущем Scala?

Я знаю много причин, чтобы Scala Будущее было лучше. Существуют ли какие-либо причины для использования Twitter Future? Кроме того, что Финал использует его.

Ответ 1

Отказ от ответственности: я работал в Twitter на будущей реализации. Немного контекста, мы начали свою собственную реализацию до того, как Scala имела "хорошую" реализацию Future.

Вот функции Twitter Future:

  • Некоторые имена методов различны, а в Twitter Future есть несколько вспомогательных методов в компаньоне.

например. Только один пример: Future.join(f1, f2) может работать в гетерогенных типах будущего.

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 гарантируется выполнение до # 2

  • Модель Threading немного отличается. Нет понятия ExecutionContext, Thread, который задает значение в Promise (Mutable implementation of the Future), тот, который выполняет все вычисления в будущем графике. например:.

    val f1 = new Promise[Int]
    f1.map(_ * 2).map(_ + 1)
    f1.setValue(2) // <- this thread also executes *2 and +1
    
  • Существует понятие прерывания/отмены. С флагов Scala информация распространяется только в одном направлении, с 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+ (я считаю).

Ответ 2

Насколько я могу судить, основное отличие, которое может пойти на использование Twitter Future, заключается в том, что его можно отменить, в отличие от scala Future.

Кроме того, некоторая поддержка отслеживания цепочек вызовов (поскольку вы, вероятно, знаете, что простые трассировки стека близки к бесполезным при использовании Futures). Другими словами, вы могли бы взять Будущее и рассказать, какая цепочка из map/flatMap создала его. Но идея была оставлена, если я правильно понял.