Scala:ExecutionContext,用于未来的理解

时间:2014-01-21 11:19:32

标签: scala future for-comprehension executioncontext

当我制作future或应用onSuccessmap等方法时,我可以为它们指定ExecutionContext。

例如,

val f = future {
  // code
} executionContext

f.map(someFunction)(executionContext)

f onSuccess {
  // code
} executionContext

但是,如果我使用了对未来的理解,我如何为yield部分指定ExecutionContext?

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会在yield中运行代码吗?

<小时/> 的修改

行。感谢答案,我找到了一些东西 如果我没有定义或导入 隐式 ExecutionContext (如Implicits.global), for-comprehension不编译。这意味着,for-comprehension使用隐式ExecutionContext。

那么,如何在没有隐式ExecutionContext的情况下使用for-comprehension,即如何指定?

2 个答案:

答案 0 :(得分:8)

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。 它具有与正在运行的计算机上的处理器一样多的线程。

默认情况下,所有期货都不会使用它,您仍然需要导入它。

更新:如果你真的想要指定,虽然不推荐,你可以打开for yield

val combined = futureA.flatMap(x => futureB)(context)

答案 1 :(得分:1)

由于for理解被“映射”到map / flatMap个操作,并且这些参数的ExecutionContext参数是隐式的,我猜你可以尝试添加{ {1}}在本地范围内:

implicit val

我认为没有“默认”隐式implicit val myContext:ExecutionContext = ...,但最常用的是ExecutionContext.Implicits.global