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

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

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

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

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

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


person Scott Morrison    schedule 18.05.2011    source источник


Ответы (2)


Здесь описывается, как переключать TaskSupport объекты в Scala 2.10.

person axel22    schedule 30.03.2012

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

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

person oxbow_lakes    schedule 18.05.2011
comment
Подтверждено - в версии 2.9.0 это не должно быть переопределено, хотя рассматривается, как разрешить это в будущих выпусках. - person axel22; 18.05.2011
comment
Спасибо за это, @oxbow_lakes. Любопытно, что FutureThreadPoolTasks кажется сиротой. @ axel22, не могли бы вы указать мне, в каком (если есть) списке рассылки это обсуждалось? - person Scott Morrison; 18.05.2011
comment
Как насчет изменения этого значения с помощью отражения? - person ziggystar; 11.08.2011