Как заменить пул разветвлений для параллельной коллекции Scala 2.9?

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

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

  1. Верно ли, что стандартные параллельные реализации взаимодействуют с пулом fork fork только через код в ForkJoinTasks?
  2. Я вижу, что есть альтернативная черта, FutureThreadPoolTasks, Как бы я создал коллекцию, которая использует эту черту вместо ForkJoinTasks?
  3. Могу ли я просто написать еще одну альтернативу (и, возможно, соответствующий шаблонный класс, который смешивается в 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._

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

Другие вопросы по тегам