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

Я знаю много причин, по которым Scala Future станет лучше. Есть ли причины использовать вместо этого Twitter Future? За исключением того, что Finagle использует его.

2 ответа

Решение

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

Вот особенности Твиттера 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 а также i сохраняют свои типы, они не относятся к наименее распространенному супертипу Any,

  • Цепочка onSuccess гарантированно будет выполнена в следующем порядке: например:

    f.onSuccess { 
      println(1) // #1
    } onSuccess { 
      println(2) // #2
    }
    

# 1 гарантированно будет выполнен до #2

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

    val f1 = new Promise[Int]
    f1.map(_ * 2).map(_ + 1)
    f1.setValue(2) // <- this thread also executes *2 and +1
    
  • Есть понятие прерывания / отмены. С помощью Scala's Futures информация распространяется только в одном направлении, а в Twitter's 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's Future была единственной, кто реализовал эффективную хвостовую рекурсию (т. Е. У вас может быть рекурсивная функция, которая вызывает сама себя, не разрушая ваш стек вызовов). Это было реализовано в Scala 2.11+ (я считаю).

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

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

Другие вопросы по тегам