2011-05-18 37 views
19

He estado mirando las nuevas colecciones paralelas de Scala 2.9 y espero abandonar muchas de mis versiones de aficionados similares de cosas 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.¿Cómo reemplazo el grupo de unión de horquilla para una colección paralela Scala 2.9?

Algunas preguntas concretas:

  1. ¿Es cierto que las implementaciones paralelas estándar interactúan con el tenedor unirse a la piscina exclusivamente 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 esta característica en lugar de ForkJoinTasks?
  3. Puedo escribir otra alternativa (y tal vez una clase reutilizable correspondiente que mezcla en AdaptiveWorkStealingTasks y de alguna manera una instancia colecciones casos que utilizan este nuevo rasgo?

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

Especialmente ejemplos de código son muy bienvenidos

Respuesta

5

Here es un documento que describe cómo cambiar los objetos TaskSupport en Scala 2.10.

16

sólo para proporcionar alguna información más sobre cómo encajan las cosas (que se sospecha que ya sé): la piscina tenedor-join está "conectado" a través el parallel valor del objeto tasksupport del paquete que implementa el rasgo scala.collection.parallel.TaskSupport.

Esto, a su vez, hereda de Tasks (que usted menciona) y define operaciones tales 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 anulación el comportamiento que se importa de forma explícita por las propias colecciones mediante el suministro de su propia implementación TaskSupport. Por ejemplo, en ParSeqLike línea 47:

import tasksupport._ 

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

+1

Confirmado: en la versión 2.9.0 no está destinado a ser anulado, aunque se está considerando cómo permitirlo en una versión futura. – axel22

+2

Gracias por esto, @oxbow_lakes. Es curioso que 'FutureThreadPoolTasks' parezca huérfano. @ axel22, ¿me puede indicar a qué lista de correo (si corresponde) se ha debatido? –

+0

¿Qué hay de cambiar este valor utilizando la reflexión? – ziggystar

Cuestiones relacionadas