Как заменить пул разветвлений для параллельной коллекции Scala 2.9?
Я смотрю на новые параллельные коллекции Scala 2.9 и надеюсь отказаться от многих моих жестоких любительских версий подобных вещей. В частности, я хотел бы заменить пул соединений форка, который лежит в основе реализации по умолчанию, на что-то мое (например, что-то, что распределяет оценку задач по сети через актеров). Насколько я понимаю, это просто вопрос применения парадигмы Scala о "наращиваемых модификациях", но библиотека коллекций настолько пугающая, что я не совсем уверен, какие биты нужно модифицировать!
Некоторые конкретные вопросы:
- Верно ли, что стандартные параллельные реализации взаимодействуют с пулом fork fork только через код в
ForkJoinTasks
? - Я вижу, что есть альтернативная черта,
FutureThreadPoolTasks
, Как бы я создал коллекцию, которая использует эту черту вместоForkJoinTasks
? - Могу ли я просто написать еще одну альтернативу (и, возможно, соответствующий шаблонный класс, который смешивается в
AdaptiveWorkStealingTasks
и как-то создавать экземпляры коллекций, которые используют эту новую черту?
(Для справки, все вышеупомянутые черты определены в Tasks.scala.)
Особенно приветствуются примеры кода!
2 ответа
Вот документ, описывающий, как переключаться TaskSupport
объекты в Scala 2.10.
Просто для того, чтобы предоставить больше информации о том, как все сочетается (что, я подозреваю, вы уже знаете): пул fork-join "подключается" через parallel
объект пакета tasksupport
значение, которое реализует 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._
На самом деле, я бы сказал, что параллелизм определенно не может быть отменен (если только я не очень ошибаюсь, хотя часто и ошибаюсь).