Search code examples
scalafuturefor-comprehensionexecutioncontext

Scala: ExecutionContext for future for-comprehension


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?


Solution

  • 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)