2015-10-07 12 views

risposta

15

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).

+0

L'annullamento ha senso, specialmente se si inviano richieste duplicate per combattere la latenza ... –

+0

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. –

+0

Beh, non ho idea del perché Scala non fornisca ExecutionContext che funziona come LocalScheduler di Twitter. –

2

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.

+0

Sì, ma hanno cancellato annullare() qualche tempo fa a favore di un aumento meno obbligatorio(). Hai usato cancel() nel codice di produzione? È stato utile? –

+0

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. –

+0

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. –

Problemi correlati