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

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

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

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

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

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

Ответы

Ответ 1

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

Ответ 2

Просто чтобы предоставить дополнительную информацию о том, как все сочетается (что, как я подозреваю, вы уже знаете): пул fork-join "подключен" через значение parallel объекта parallel объекта 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._

Фактически, я бы сказал, что это выглядит так: parallelism окончательно не переопределяется (если я не ошибаюсь, хотя часто бываю).