Как заменить пул разветвлений для параллельной коллекции Scala 2.9? - PullRequest
19 голосов
/ 18 мая 2011

Я смотрю на новые параллельные коллекции Scala 2.9 и надеюсь отказаться от многих моих жестоких любительских версий подобных вещей.В частности, я хотел бы заменить пул соединений форка, который лежит в основе реализации по умолчанию, на что-то мое (например, что-то, что распределяет оценку задач по сети через актеров).Насколько я понимаю, это просто вопрос применения парадигмы Scala о «наращиваемых модификациях», но библиотека коллекций настолько пугающая, что я не совсем уверен, какие биты нужно модифицировать!

Некоторые конкретные вопросы:

  1. Правильно ли, что стандартные параллельные реализации взаимодействуют с пулом объединения вил исключительно через код в ForkJoinTasks?
  2. Я вижучто есть альтернативная черта, FutureThreadPoolTasks.Как бы я собрал коллекцию, которая использует эту черту вместо ForkJoinTasks?
  3. Могу ли я просто написать еще одну альтернативу (и, возможно, соответствующий шаблонный класс, который смешивается в AdaptiveWorkStealingTasks и как-то создавать экземпляры коллекций, которые используют эту новую черту?

(Для справки, все упомянутые выше черты определены в Tasks.scala .)

Особенно приветствуются примеры кода!

Ответы [ 2 ]

16 голосов
/ 18 мая 2011

Просто для того, чтобы предоставить больше информации о том, как все сочетается (что, я подозреваю, вы уже знаете): пул fork-join «подключается» через значение tasksupport объекта пакета parallel, которое реализует scala.collection.parallel.TaskSupport черта.

Это, в свою очередь, наследуется от Tasks (который вы упоминаете) и определяет такие операции как:

def execute[R, Tp](fjtask: Task[R, Tp]): () => R

def executeAndWaitResult[R, Tp](task: Task[R, Tp]): R

Однако, для меня не сразу очевидно, как вы можете переопределить поведение, которое явно импортируется самими коллекциями путем предоставления вашей собственной реализации TaskSupport. Например, в ParSeqLike строке 47:

import tasksupport._

На самом деле, я бы сказал, что параллелизм окончательно не может быть переопределен (если только я не сильно ошибаюсь, хотя часто и ошибаюсь).

5 голосов
/ 31 марта 2012

Здесь - документ, описывающий, как переключать TaskSupport объекты в Scala 2.10.

...