Conosco molti motivi per cui il futuro di Scala è migliore. Ci sono dei motivi per usare Twitter Future? Tranne il fatto che Finagle lo usa.Quali sono i vantaggi di un futuro di Twitter su un futuro di Scala?
risposta
Disclaimer: Ho lavorato a Twitter sull'implementazione Future. Un po 'di contesto, abbiamo iniziato la nostra implementazione prima che Scala avesse una "buona" implementazione di Future
.
Here're le caratteristiche di Twitter di Future
:
- Alcuni nomi dei metodi sono diversi e Twitter di
Future
ha alcuni nuovi metodi di supporto nel compagno.
ad es. Un solo esempio: Future.join(f1, f2)
può funzionare su tipi Future eterogenei.
Future.join(
Future.value(new Object), Future.value(1)
).map {
case (o: Object, i: Int) => println(o, i)
}
o
e i
mantenere i loro tipi, non sono casted in almeno supertipo comune Any
.
Una catena di onSuccess è garantita da eseguire in ordine: es:
f.onSuccess { println(1) // #1 } onSuccess { println(2) // #2 }
# 1 è garantita da eseguire prima # 2
L' Il modello di threading è leggermente diverso. Non esiste la nozione di ExecutionContext, la discussione che imposta il valore in una Promessa (implementazione mutevole di un futuro) è quella che esegue tutti i calcoli nel grafico futuro. es .:
val f1 = new Promise[Int] f1.map(_ * 2).map(_ + 1) f1.setValue(2) // <- this thread also executes *2 and +1
C'è una nozione di interruzione/cancellazione. Con i Futures di Scala, l'informazione fluisce solo in una direzione, con Twitter's Future, puoi informare un produttore di alcune informazioni (non necessariamente una cancellazione). In pratica, è usato in Finagle per propagare la cancellazione di un RPC. Perché Finagle diffonde anche la cancellazione attraverso la rete e poiché Twitter ha un enorme fan di richieste, questo in realtà consente di risparmiare un sacco di lavoro.
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"
Fino a poco tempo, il futuro di Twitter erano l'unica ad implementare efficienti ricorsione di coda (vale a dire si può avere una funzione ricorsiva che si chiama, senza far saltare in aria si chiama stack). È stato implementato in Scala 2.11+ (credo).
Per quanto posso dire la differenza principale che potrebbe andare a favore dell'utilizzo di Twitter Future
è che può essere annullato, a differenza di scala Future
di scala.
Inoltre, c'era un po 'di supporto per tracciare le catene di chiamata (come probabilmente sapete che tracce di stack semplici sono quasi inutili quando si usano Futures). In altre parole, potresti prendere un futuro e dire quale catena di map
/flatMap
ha prodotto. Ma l'idea è stata abbandonata se ho capito bene.
Sì, ma hanno cancellato annullare() qualche tempo fa a favore di un aumento meno obbligatorio(). Hai usato cancel() nel codice di produzione? È stato utile? –
Non l'ho usato in parte perché non volevo essere bloccato con 'Future' di Twitter non standard. Ma è facile vedere usi per questo. Supponi di generare contemporaneamente alcuni futuri e poi unire i loro risultati attraverso "Future.sequence" per creare un risultato finale. Se uno fallisce, ti piacerebbe fallire velocemente, in altre parole cancellare tutti gli altri futures per salvarti da calcoli inutili. Probabilmente, il modo standard/migliore/meno fragile per gestire questa situazione (senza fare affidamento sul futuro annullamento) è di utilizzare invece gli attori. –
Per quanto riguarda l'annullamento di 'cancel' a favore di 'raise', la motivazione rimane valida: è qualcosa che non è in' Future' di scala e * potrebbe * farti raggiungere per la versione di Twitter. –
- 1. Quali sono le differenze tra un futuro di Scala e un futuro di Java
- 2. convertiamo il futuro di Scala nel futuro di Twitter
- 3. mittente all'interno di un futuro
- 4. Scala Futuro [Opzione [T]] Un imballaggio
- 5. Conversione Metodo Scala @suspendable in un futuro
- 6. Converti futuro scala per il futuro del Java
- 7. Opzione Scala [Futuro [T]] a Futuro [Opzione [T]]
- 8. Mappa l'eccezione di un futuro fallito
- 9. Quali sono i vantaggi di JRebel?
- 10. Quali sono i vantaggi dell'uso di Scala in .Net?
- 11. Quali sono i vantaggi di java.nio per un server web?
- 12. Quali sono i vantaggi nell'utilizzo di Qt?
- 13. Quali sono i vantaggi dell'utilizzo di WCF?
- 14. Come fermare timeout di un futuro
- 15. Quali sono i veri vantaggi di ExpandoObject?
- 16. Quali sono i vantaggi dell'utilizzo di un errback?
- 17. Ottenere un risultato nel futuro?
- 18. quali sono i vantaggi dell'uso di scrapyd?
- 19. Quali sono i vantaggi di Persistenza Ignoranza?
- 20. Quali sono i vantaggi dell'utilizzo di automapper?
- 21. Quali sono i vantaggi di un MembershipProvider personalizzato in ASP.NET?
- 22. Quali sono i vantaggi di utilizzare un iteratore in Java
- 23. Aspetta il thread di blocco di Scala Futuro?
- 24. Quali sono i vantaggi dell'uso di Elixir
- 25. Quali sono i vantaggi di NSBinaryStoreType?
- 26. Quali sono i vantaggi/vantaggi dell'utilizzo di Python 3?
- 27. Quali sono i vantaggi di un programma di installazione MSI su un setup.exe standard?
- 28. Scala futuro con filtro per la comprensione
- 29. Quali sono i vantaggi di LINQ su SQL?
- 30. Quali sono i vantaggi di PyQt su PyGTK e viceversa?
L'annullamento ha senso, specialmente se si inviano richieste duplicate per combattere la latenza ... –
Ciao, Steve. Molto tempo non ci vediamo MrGreen. Spero che tutto vada bene per te. Per quanto riguarda la domanda, la parte sul modello di threading è un'enorme differenza, infatti, mi sono dimenticato di quello. Con 'Future' di scala dobbiamo richiedere un contesto di esecuzione implicito ogni volta che vogliamo semplicemente mappare su un futuro anche per banali thins come l'aggiunta di un log, mentre con 'Future' di Twitter possiamo portarlo sul thread del futuro originale. –
Beh, non ho idea del perché Scala non fornisca ExecutionContext che funziona come LocalScheduler di Twitter. –