scala parallel-processing scala-2.9 parallel-collections

¿Cómo reemplazo el grupo de unión de horquilla para una colección paralela Scala 2.9?



parallel-processing scala-2.9 (2)

Solo para proporcionar más información sobre cómo encajan las cosas (que sospecho que ya sabe): el grupo fork-join está "conectado" a través del valor de tasksupport de tasksupport del objeto del paquete parallel que implementa el rasgo scala.collection.parallel.TaskSupport .

Esto, a su vez, hereda de Tasks (que mencionas) y define tales operaciones como:

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

Sin embargo, no es inmediatamente obvio para mí cómo puede anular el comportamiento que las propias colecciones importan explícitamente mediante el suministro de su propia implementación de TaskSupport . Por ejemplo, en ParSeqLike línea 47:

import tasksupport._

De hecho, iría tan lejos como para decir que parece que el paralelismo definitivamente no es imposible (a menos que esté muy equivocado, aunque a menudo lo estoy).

He estado revisando las nuevas colecciones paralelas de Scala 2.9 y espero abandonar muchas de mis versiones de aficionados similares. En particular, me gustaría reemplazar el grupo de unión fork que subyace a la implementación predeterminada con algo propio (por ejemplo, algo que distribuye la evaluación de tareas a través de una red, a través de actores). Tengo entendido que esto es simplemente una cuestión de aplicar el paradigma de Scala de "modificaciones apilables", pero la biblioteca de colecciones es lo suficientemente intimidante como para no estar seguro de qué partes necesitan modificarse.

Algunas preguntas concretas:

  1. ¿Es correcto que las implementaciones en paralelo estándar interactúen con el grupo de unión tenedor únicamente a través del código en ForkJoinTasks ?
  2. Veo que hay un rasgo alternativo, FutureThreadPoolTasks . ¿Cómo construiría una colección que use este rasgo en lugar de ForkJoinTasks ?
  3. ¿Puedo simplemente escribir otra alternativa (y tal vez una clase repetitiva correspondiente que se mezcle en AdaptiveWorkStealingTasks y de alguna manera crear instancias de colecciones que usen este nuevo rasgo?

(Como referencia, todos los rasgos mencionados anteriormente se definen en Tasks.scala ).

¡Especialmente los ejemplos de código son muy bienvenidos!


Aquí hay un documento que describe cómo cambiar objetos TaskSupport en Scala 2.10.