Znam wiele powodów, dla których Scala Future będzie lepsza. Czy są jakieś powody do używania Twitter Future zamiast? Poza tym, że Finagle go używa.Jakie są zalety Twitter Future w stosunku do Scala Future?
Odpowiedz
Nota prawna: Pracowałem na Twitterze nad implementacją Future. Trochę kontekstu, rozpoczęliśmy własną implementację, zanim Scala miała "dobrą" implementację Future
.
Here're cechy Twittera Future
:
- Niektóre nazwy są różne metody i Twittera
Future
ma kilka nowych metod pomocniczych w towarzysza.
np. Tylko jeden przykład: Future.join(f1, f2)
może pracować na heterogenicznych typach Future.
Future.join(
Future.value(new Object), Future.value(1)
).map {
case (o: Object, i: Int) => println(o, i)
}
o
i i
zachować swoje typy, nie są one odlewane do najmniejszego wspólnego supertypem Any
.
Łańcuch onSuccess gwarantuje realizowane w podanej kolejności: np
f.onSuccess { println(1) // #1 } onSuccess { println(2) // #2 }
# 1 jest zagwarantowana jest wykonywane przed # 2
Model gwintowania jest trochę inny. Nie ma pojęcia Kontekstu Wykonawczego, Wątek, który wyznaczył wartość w Obietnicy (Mutable Implementation of the Future), to ten, który wykonuje wszystkie obliczenia na przyszłym wykresie. np .:
val f1 = new Promise[Int] f1.map(_ * 2).map(_ + 1) f1.setValue(2) // <- this thread also executes *2 and +1
Istnieje pojęcie przerwania/odwołania. Dzięki Futures firmy Scala informacje płyną tylko w jednym kierunku, a dzięki Przyszłości Twittera możesz powiadomić producenta o pewnych informacjach (niekoniecznie anulowaniu). W praktyce jest on używany w programie Finagle do propagowania anulowania wywołania RPC. Ponieważ Finagle propaguje również anulowanie w całej sieci i ponieważ Twitter ma ogromną popularność z żądań, to faktycznie oszczędza dużo pracy.
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"
Do niedawna Twittera Future były jedynym wdrożyć efektywne ogon rekurencji (czyli można mieć funkcji rekurencyjnej, że nazywają się bez wysadzania zadzwonić stosu). Został zaimplementowany w Scali 2.11+ (jak sądzę).
O ile mogę stwierdzić, że główną różnicą, która mogłaby sprzyjać korzystaniu z Twittera Future
, jest to, że można je anulować, w przeciwieństwie do wersji Future
firmy scala.
Ponadto, istniało pewne wsparcie dla śledzenia łańcuchów wywołań (jak zapewne wiesz, ślady zwykłego stosu są prawie bezużyteczne w przypadku kontraktów Futures). Innymi słowy, możesz wziąć Future i powiedzieć, który łańcuch wyprodukował go. Ale pomysł został porzucony, jeśli dobrze rozumiem.
Tak, ale wycofali się cancel() jakiś czas temu na rzecz mniej obowiązkowego podwyżki(). Czy używałeś cancel() w kodzie produkcyjnym? Czy to było przydatne? –
Nie użyłem tego częściowo dlatego, że nie chciałem utknąć w nietypowej "przyszłości" Twittera. Łatwo jest jednak zobaczyć, jakie są jego zastosowania. Załóżmy, że równolegle spawnujesz kilka kontraktów futures, a następnie dołączasz do ich wyników za pomocą 'Future.sequence', aby uzyskać ostateczny wynik. Jeśli ktoś zawiedzie, chciałbyś szybko ponieść klęskę, innymi słowy, aby anulować wszystkie inne przyszłości, aby uratować się od bezużytecznych obliczeń. Prawdopodobnie standardowy/lepszy/mniej kruchy sposób poradzenia sobie z tą sytuacją (bez polegania na przyszłym anulowaniu) polega na użyciu aktorów. –
Co do 'cancel', które jest przestarzałe na rzecz' raise', to nadal ma rację: to coś, czego nie ma w 'Przyszłości' scala i * może * sprawić, że sięgniesz po wersję Twittera. –
Anulowanie ma sens, zwłaszcza jeśli wydajesz duplikaty próśb o opóźnienie ... –
Witaj, Steve. Dawno nie widzę :-D. Mam nadzieję, że wszystko dla ciebie dobrze. Jeśli chodzi o to pytanie, część dotycząca modelu wątków jest ogromną różnicą, zapomniałem o tym. W "Przyszłości" programu scala musimy zażądać niejawnego kontekstu wykonania za każdym razem, gdy chcemy po prostu mapować przyszłość nawet w przypadku niewielkich cracków, takich jak dodanie dziennika, podczas gdy przy użyciu "Przyszłości" na Twitterze możemy śledzić wątek oryginalnej przyszłości. –
Cóż, nie mam pojęcia, dlaczego Scala nie zapewnia ExecutionContext, który działa jak LocalScheduler Twittera. –