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