実際に何が起こるかを明確に述べているドキュメントへのリンクを提供することはできませんが、あなたの質問に答える簡単な実験を行うことはできます.
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
Future
scala 2.10 の実装とは異なり、新しいタスクを生成せず、暗黙の を必要map
とflatMap
しませんExecutionContext
。代わりに、map
またはをflatMap
介して明示的にフォークされない限り、「現在の」スレッドによって実行される現在の (トランポリンされた) 継続に追加するだけです。これは、2.10 の実装よりもはるかに優れたスレッドの再利用を実現し、不必要なスレッド プールのサブミット サイクルを回避することを意味します。Future.fork
Future.apply
Future
Future
また、必ずしも実行中の計算Future
を表すとは限らないという点で、scala 2.10型とは異なります。代わりに、インターフェイスの関数を使用して非決定性を明示的に再導入します。これにより、実装が簡素化され、コードの推論が容易になります。これは、効果の順序と非決定論のポイントが完全に明示され、Scala の評価順序に依存しないためです。scalaz.Nondeterminsm
重要な注意:Future
にはエラー処理が含まれていないため、通常、Future
の機能を基に構築したいが、独自のエラー処理戦略を設計したいライブラリ作成者によるビルディング ブロックとしてのみ使用する必要があります。scalaz.concurrent.Task
適切なエラー処理で拡張される型を参照してください。これは、多数の追加の便利な関数を備えたFuture
単なるラッパーです。Future[Either[Throwable,A]]