私はScala Futureがより良くなる理由をたくさん知っています。代わりにTwitter Futureを使用する理由はありますか? Finagleがそれを使うという事実を除いて。Scalaの未来に対するTwitterの将来の利点は何ですか?
答えて
免責事項: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)
}
o
とi
その型を維持し、彼らは少なくとも、共通のスーパータイプ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以降で実装されています(私は信じています)。
TwitterのFuture
を使用することに有利な主な違いは、スカラのFuture
とは異なり、キャンセルできるということです。
また、コールチェーンをトレースするためのサポートがありました(おそらく、未処理のスタックトレースはFuturesを使用するときには役に立たないことが分かります)。言い換えれば、あなたは未来をとって、map
/flatMap
のどの鎖がそれを作り出したかを伝えることができます。しかし、私が正しく理解すれば、そのアイデアは放棄されました。
しかし、彼らはあまり義務的ではないraise()を支持しています。プロダクションコードでcancel()を使用しましたか?それは役に立ちましたか? –
非標準のツイッターの「未来」にこだわったくないので、私は部分的に使っていません。しかし、それを使用するのは簡単です。いくつかの先物を同時に生成し、その結果を「Future.sequence」に参加させて最終結果を構築するとします。もし誰かが失敗すれば、あなたは無駄な計算から自分を救うために、他のすべての未来を取り消すために、速く失敗したいと思います。おそらく、この状況を処理する(将来の取り消しに頼ることなく)標準/より良い/あまり脆弱な方法は、代わりに俳優を使用することです。 –
'cancel'が' raise'のために廃止されたとしても、その根拠はまだあります。それはスカラーのFutureにはなく、Twitterのバージョンに到達するかもしれません。 –
- 1. Scalaの将来のオプションから将来のオブジェクトを取得
- 2. 他の将来の未来を完了
- 3. 近い将来Scalaの本
- 4. Java 3Dの将来は何ですか?
- 5. Apache Hbaseの将来は何ですか
- 6. Class :: DBIの将来は何ですか?
- 7. SCALA:将来のコールバック内で将来コールバックを開始する方法
- 8. Scalaの将来の価値を返す
- 9. 未来と未来の違いは何ですか?
- 10. 未来と未来の違いは何ですか?
- 11. Scalaの将来のリストのサイズチェック
- 12. Scalaの将来の内部の歩み
- 13. Scala Slick 3将来のクラスコールバックパターンの一致
- 14. 将来のAjax応答待ち(scala)
- 15. Scala Play将来の相互依存性
- 16. Scala将来の奇妙なコンパイルエラー
- 17. Syncronous Scala別スレッドなしの将来
- 18. Scala未来のエラーをキャッチ
- 19. Flattening List + Scalaの未来
- 20. 市場におけるBizTalk Serverの将来は何ですか?
- 21. VBAの未来は何ですか?
- 22. 将来のスカラマップ
- 23. SchemaUpdateの将来?
- 24. OrientDBの将来
- 25. 将来のロールバック
- 26. は将来FindElements
- 27. Scala将来のコールバックは何もしていないようです
- 28. Spring-XDの将来
- 29. 将来のMicrosoftエンタープライズライブラリ
- 30. Sys.require、ASP.NET AJAXローダースクリプトの将来は何ですか?
キャンセルは意味があります。特に、レイテンシと戦うために重複したリクエストを発行する場合は... –
こんにちはSteve。長い時間は見ない: - D。あなたのためにすべてがうまくいくことを願ってください。質問に関して、スレッドモデルの部分は実際には大きな違いがあり、私はそれを忘れていました。 scalaの 'Future'では、ログを追加するなどの些細な作業でも未来をマッピングするたびに暗黙的な実行コンテキストを要求する必要がありますが、Twitterの' Future'では元の未来のスレッドにピギーバックできます。 –
ScalaがTwitterのLocalSchedulerのように動作するExecutionContextを提供しない理由はわかりません。 –