2015-10-07 21 views

答えて

15

免責事項:Twitterでの未来の実装で働いていました。少しの文脈では、ScalaがFutureの「良い」実装を実装する前に独自の実装を開始しました。 TwitterのFuture

Here're機能:

  • いくつかのメソッド名が異なっており、TwitterのFutureは仲間でいくつかの新しいヘルパーメソッドを持っています。

ちょうど1つの例:Future.join(f1, f2)は異種の未来型で働くことができます。

Future.join(
    Future.value(new Object), Future.value(1) 
).map { 
    case (o: Object, i: Int) => println(o, i) 
} 

oiその型を維持し、彼らは少なくとも、共通のスーパータイプAnyにキャストしていません。

  • するonSuccessの鎖が順に実行されることが保証されている: 例えば:

    f.onSuccess { 
        println(1) // #1 
    } onSuccess { 
        println(2) // #2 
    } 
    

#1#2

  • 前に実行されることが保証されていますスレッディングモデルは少し異なります。 ExecutionContextの概念はなく、Promise(FutureのMutable実装)の値を設定するThreadは、将来のグラフのすべての計算を実行するスレッドです。 は、例えば:

    val f1 = new Promise[Int] 
    f1.map(_ * 2).map(_ + 1) 
    f1.setValue(2) // <- this thread also executes *2 and +1 
    
  • 中断/キャンセルの概念があります。 ScalaのFuturesでは、情報は一方向にしか流れず、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の未来(すなわち、あなたがスタックをコール爆破せずに自分自身を呼び出す再帰関数を持つことができる)、効率的な末尾再帰を実装するための唯一の1でした。これはScala 2.11以降で実装されています(私は信じています)。

+0

キャンセルは意味があります。特に、レイテンシと戦うために重複したリクエストを発行する場合は... –

+0

こんにちはSteve。長い時間は見ない: - D。あなたのためにすべてがうまくいくことを願ってください。質問に関して、スレッドモデルの部分は実際には大きな違いがあり、私はそれを忘れていました。 scalaの 'Future'では、ログを追加するなどの些細な作業でも未来をマッピングするたびに暗黙的な実行コンテキストを要求する必要がありますが、Twitterの' Future'では元の未来のスレッドにピギーバックできます。 –

+0

ScalaがTwitterのLocalSchedulerのように動作するExecutionContextを提供しない理由はわかりません。 –

2

TwitterのFutureを使用することに有利な主な違いは、スカラのFutureとは異なり、キャンセルできるということです。

また、コールチェーンをトレースするためのサポートがありました(おそらく、未処理のスタックトレースはFuturesを使用するときには役に立たないことが分かります)。言い換えれば、あなたは未来をとって、map/flatMapのどの鎖がそれを作り出したかを伝えることができます。しかし、私が正しく理解すれば、そのアイデアは放棄されました。

+0

しかし、彼らはあまり義務的ではないraise()を支持しています。プロダクションコードでcancel()を使用しましたか?それは役に立ちましたか? –

+0

非標準のツイッターの「未来」にこだわったくないので、私は部分的に使っていません。しかし、それを使用するのは簡単です。いくつかの先物を同時に生成し、その結果を「Future.sequence」に参加させて最終結果を構築するとします。もし誰かが失敗すれば、あなたは無駄な計算から自分を救うために、他のすべての未来を取り消すために、速く失敗したいと思います。おそらく、この状況を処理する(将来の取り消しに頼ることなく)標準/より良い/あまり脆弱な方法は、代わりに俳優を使用することです。 –

+0

'cancel'が' raise'のために廃止されたとしても、その根拠はまだあります。それはスカラーのFutureにはなく、Twitterのバージョンに到達するかもしれません。 –