Каковы преимущества будущего 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
произвел это. Но идея была заброшена, если я правильно понимаю.