问题
When I make a future
, or apply methods like onSuccess
and map
, I can specify ExecutionContext for them.
For example,
val f = future {
// code
} executionContext
f.map(someFunction)(executionContext)
f onSuccess {
// code
} executionContext
However, if I use a for-comprehension of future, how can I specify ExecutionContext for the yield
part?
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
And, what ExecutionContext runs the code in yield if not specified?
EDIT
OK. Thanks to answers, I found something.
If I don't define or import implicit ExecutionContext (like Implicits.global
),
the for-comprehension does not compile. That means, for-comprehension uses implicit ExecutionContext.
Then, how can I use for-comprehension without implicit ExecutionContext, i.e. how to specify?
回答1:
The ExecutionContext
parameter is actually implicit
. That means you can:
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.
}
You also have a default, namely scala.concurrent.ExecutionContext.Implicits.global
.
This has as many threads as the processors on the running machine.
It won't be used by all Futures by default, you still have to import it.
Update: If you really want to specifiy, although it's not recommended, you can unwrap the for yield
val combined = futureA.flatMap(x => futureB)(context)
回答2:
Since for
comprehensions are "mapped" to map
/flatMap
operations, and the ExecutionContext
parameters of those are implicit, I guess you can try to add an implicit val
in the local scope:
implicit val myContext:ExecutionContext = ...
.
I don't believe there is a "default" implicit ExecutionContext
, but the most commonly used one is ExecutionContext.Implicits.global .
来源:https://stackoverflow.com/questions/21256615/scala-executioncontext-for-future-for-comprehension