15

Scala 2.10 の新しい Future は、アクションが非同期的に呼び出されるすべての操作 ( 、 などを含む) に対して実行コンテキストを使用しmapますfilter。これは、すべてのアクションが常に実行コンテキストを介して個別に呼び出されることを意味しますか?それとも、同じ実行コンテキストを使用して複数の変換/フィルターをチェーンするときに、このステップが最適化されてなくなる可能性はありますか?

つまりf.map(...).filter(...).map(...)、すべて同じ実行コンテキストで を実行する場合、この呼び出しはexecute()1 回 (上記から同期関数を構成するのに十分賢いため) でしょうか、それとも 3 回でしょうか?

scala future が上記の最適化を行わない場合、上記を行う長いチェーン構成により適した代替フレームワークはありますか?

4

1 に答える 1

11

実際に何が起こるかを明確に述べているドキュメントへのリンクを提供することはできませんが、あなたの質問に答える簡単な実験を行うことはできます.

Scala REPL を開いて、次のコードを貼り付けるだけです。

import java.util.concurrent.Executors
import scala.concurrent._

implicit val ec = new ExecutionContext {
    val threadPool = Executors.newFixedThreadPool(1000);

    def execute(runnable: Runnable) {
        threadPool.submit(runnable)
        println("execute!")
    }

    def reportFailure(t: Throwable) {}
}

future { 1 } map(_ + 1) filter (_ > 0) map (_ + 2) 

それは印刷されます:

scala> future { 1 } map(_ + 1) フィルター (_ > 0) map (_ + 2)
実行!
実行する!
実行する!
実行する!
res0: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@7ef3de76

したがって、実行中のすべての操作に対して execute が呼び出されます (ドキュメントで確認できるように、map や filter などの各関数は、暗黙的なパラメーターとして ExecutionContext を取ります: http://www.scala-lang.org/api/2.10.6 /#scala.concurrent.Future )

代替フレームワークを探している場合は、scalaz Futures を確認してください。私は彼らとの経験はありませんが、彼らはあなたが探しているもののようです. このスレッドを確認してください: https://groups.google.com/forum/#!msg/scalaz/-PuakIf-g_4/7ydrU5VIfDQJ

Futurescala 2.10 の実装とは異なり、新しいタスクを生成せず、暗黙の を必要mapflatMapしませんExecutionContext。代わりに、mapまたはをflatMap介して明示的にフォークされない限り、「現在の」スレッドによって実行される現在の (トランポリンされた) 継続に追加するだけです。これは、2.10 の実装よりもはるかに優れたスレッドの再利用を実現し、不必要なスレッド プールのサブミット サイクルを回避することを意味します。Future.forkFuture.applyFuture

Futureまた、必ずしも実行中の計算Futureを表すとは限らないという点で、scala 2.10型とは異なります。代わりに、インターフェイスの関数を使用して非決定性を明示的に再導入します。これにより、実装が簡素化され、コードの推論が容易になります。これは、効果の順序と非決定論のポイントが完全に明示され、Scala の評価順序に依存しないためです。scalaz.Nondeterminsm

重要な注意:Futureにはエラー処理が含まれていないため、通常、Futureの機能を基に構築したいが、独自のエラー処理戦略を設計したいライブラリ作成者によるビルディング ブロックとしてのみ使用する必要があります。scalaz.concurrent.Task適切なエラー処理で拡張される型を参照してください。これは、多数の追加の便利な関数を備えたFuture単なるラッパーです。Future[Either[Throwable,A]]

于 2013-12-28T00:28:42.137 に答える