2009-10-20 11 views
12

Tengo una aplicación java/scala existente que utiliza un grupo de subprocesos global. Me gustaría comenzar a utilizar actores en el proyecto, pero me gustaría que todo en la aplicación use el mismo grupo.Cómo designar un grupo de subprocesos para actores

Sé que puedo establecer el número máximo de hilos que utilizan los actores, pero preferiría compartir el conjunto de hilos. ¿Es esto necesario/razonable, y es posible designar el grupo de hilos del actor?

Si no es posible/recomendado, ¿hay alguna regla general al integrar actores en aplicaciones que ya están usando subprocesos?

Gracias.

Respuesta

7

Creo que se puede hacer algo como esto:

trait MyActor extends Actor { 
    val pool = ... // git yer thread pool here 
    override def scheduler = new SchedulerAdapter { 
    def execute(block: => Unit) = 
     pool.execute(new Runnable { 
     def run() { block } 
     }) 
    } 
} 
+0

Supongo que debe escribir "val scheduler =" en lugar de "def scheduler =", de lo contrario, tendrá varias instancias de planificadores. –

+0

También es más eficiente sobrescribir executeFromActor (task: Runnable) y execute (task: Runnable) para ejecutar inmediatamente por pool: https://github.com/plokhotnyuk/actors/blob/master/src/test/scala/com /github/plokhotnyuk/actors/ScalaActorSpec.scala#L20 –

2

pero es bastante fácil de volver a utilizar el grupo de subprocesos utilizados por el subsistema de actor. En primer lugar usted puede controlar su tamaño:

-Dactors.maxPoolSize=8 

Y se puede invocar la intervención en él

actors.Scheduler.execute(f); //f is => Unit 

Lo único que le falta es la posibilidad de programar el trabajo. Para ello utilizo una por separado ScheduledExecutorService que es un único subproceso y se ejecuta su trabajo en la piscina actores hilo:

object MyScheduler { 
    private val scheduler = Executors.newSingleThreadedScheduledExecutorService 

    def schedule(f: => Unit, delay: (Long, TimeUnit)) : ScheduledFuture[_] = { 
     scheduler.schedule(new ScheduledRun(f), delay._1, delay._2) 
    } 

    private class ScheduledRun(f: => Unit) extends Runnable { 
    def run = actors.Scheduler.execute(f) 
    } 

} 

A continuación, se puede usar esto para programar cualquier cosa:

MyScheduler.schedule(f, (60, SECONDS)) 
6

para Scala 2.8 .1 es:

scala -Dactors.corePoolSize=20 
Cuestiones relacionadas