Передается ли неявный контекст выполнения операциям .par? - PullRequest
0 голосов
/ 22 сентября 2018

У меня такая ситуация:

  • метод a: создается неявный ec

  • метод a: вызывает другой метод в будущем,то есть Future(anotherMethod).anotherMethod, и все его последующие вызовы больше не имеют ec из метода a в области видимости.

Пример кода:

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.Правильно ли мое предположение?

1 Ответ

0 голосов
/ 22 сентября 2018

Я предполагаю, что любые вызовы .par, например someVector.par.map. (). Seq и т. Д. Из anotherMethod или любых его последующих вызовов, будут использовать глобальный контекст выполнения, а не пользовательский.один создан в методе а.Верно ли мое предположение?

Давайте разделим этот ответ на две части.Во-первых, если у вас есть какие-то другие методы в вашей цепочке вызовов, которые потребуют неявного ExecutionContext, они получат тот, который неявно определен в вашем вызове methodA верхнего уровня.

В противном случае дизайн параллельной коллекции вScala не имеет понятия ExecutionContext, это строго свойство Future.В библиотеке параллельных коллекций есть понятие TaskSupport, которое отвечает за планирование внутри параллельной коллекции:

*  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, объявленным в Foo.Однако вы можете явно установить их с помощью установщика tasksupport:

val par = List(1,2,3,4).par
par.tasksupport = new ForkJoinTaskSupport(new ForkJoinPool(4))
...