当我制作future
或应用onSuccess
和map
等方法时,我可以为它们指定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,即如何指定?
答案 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
。