1

我有这种情况:

  • 方法a:创建隐式ec

  • 方法 a:调用 Future 中的另一个方法,即Future(anotherMethod). anotherMethod,并且其所有后续调用不再具有来自方法 a 的 ec 范围。

示例代码:

class Foo {
  private implicit val ec: ExecutionContextExecutor =
        ExecutionContext.fromExecutor(Executors.newFixedThreadPool(Runtime.getRuntime.availableProcessors()))

  private val anotherClass = new Bar()

  def methodA() = Future(anotherClass.anotherMethod())
}

我猜想,任何来自或任何后续调用的调用.par,例如someVector.par.map.().seq等,anotherMethod都将使用全局执行上下文,而不是在方法 a 中创建的自定义上下文。我的假设正确吗?

4

1 回答 1

5

我猜,从 anotherMethod 或其任何后续调用对 .par 的任何调用,例如 someVector.par.map.().seq 等,都将使用全局执行上下文,而不是在方法 a 中创建的自定义上下文。我的假设正确吗?

让我们把这个答案一分为二。首先,如果您的调用链中有任何其他需要隐式的方法ExecutionContext,它们将获得在您的顶级methodA调用中隐式定义的方法。

否则,Scala 中的并行集合设计没有 的概念ExecutionContext,它严格来说是 的属性Future。并行集合库有一个TaskSupport负责并行集合内部调度的 a 的概念:

*  Parallel collections are modular in the way operations are scheduled. Each
*  parallel collection is parameterized with a task support object which is
*  responsible for scheduling and load-balancing tasks to processors.

ExecutionContext所以这些并行集合将与 in 中声明的没有任何关系Foo。但是,您可以通过tasksupportsetter 显式设置它们:

val par = List(1,2,3,4).par
par.tasksupport = new ForkJoinTaskSupport(new ForkJoinPool(4))
于 2018-09-22T12:16:56.877 回答