7

を作成したり、 や のようなメソッドを適用したりするときに、futureそれらに ExecutionContext を指定できます。onSuccessmap

例えば、

val f = future {
  // code
} executionContext

f.map(someFunction)(executionContext)

f onSuccess {
  // code
} executionContext

ただし、将来の for-comprehension を使用する場合、その部分に ExecutionContext を指定するにはどうすればよいyieldですか?

for {
  f <- future1
  g <- future2
} yield {
  // code to be executed after future1 onSuccess and future2 onSuccess
  // What ExecutionContext runs this code?
} // (executionContext) here does not work

そして、指定されていない場合、どの ExecutionContext がコードを生成して実行しますか?


編集

わかった。回答のおかげで、私は何かを見つけました。暗黙のExecutionContext (のような)
を定義またはインポートしないと、for-comprehension はコンパイルされません。つまり、for-comprehension は暗黙の ExecutionContext を使用します。Implicits.global

では、暗黙の ExecutionContext なしで for-comprehension を使用するにはどうすればよいでしょうか、つまりどのように指定すればよいのでしょうか?

4

2 に答える 2

9

ExecutionContextパラメータは実際にはimplicit. つまり、次のことができます。

import scala.concurrent.ExecutionContext

implicit val context = ExecutionContext.fromExecutor(//etc)
for {
  f <- future1
  g <- future2
} yield {
  // code to be executed after future1 onSuccess and future2 onSuccess
  // What ExecutionContext runs this code?: the one above.
}

また、デフォルト、つまり もありますscala.concurrent.ExecutionContext.Implicits.global。これには、実行中のマシンのプロセッサと同じ数のスレッドがあります。

デフォルトではすべての Future で使用されるわけではなく、インポートする必要があります。

更新:本当に指定したい場合は、お勧めしませんが、ラップを解除できますfor yield

val combined = futureA.flatMap(x => futureB)(context)
于 2014-01-21T11:25:10.317 に答える
1

内包表記は/操作にfor「マップ」されており、それらのパラメーターは暗黙的であるため、ローカル スコープに an を追加してみることができると思います。mapflatMapExecutionContextimplicit val

implicit val myContext:ExecutionContext = ...

.

「デフォルト」の Implicit があるとは思いませんExecutionContextが、最も一般的に使用されるのはExecutionContext.Implicits.globalです。

于 2014-01-21T11:26:16.777 に答える