2009-10-20 20 views
12

Ho un'applicazione java/scala esistente che utilizza un pool di thread globale. Vorrei iniziare a utilizzare gli attori nel progetto, ma mi piacerebbe tutto nell'app che utilizza lo stesso pool.Come designare un pool di thread per gli attori

So che posso impostare il numero massimo di thread che gli attori utilizzano ma preferirei condividere il pool di thread. È necessario/ragionevole ed è possibile designare il pool di thread dell'attore?

Se non è possibile/consigliato, ci sono regole empiriche quando si integrano gli attori in app che stanno già utilizzando thread?

Grazie.

risposta

7

io credo che si possa fare qualcosa di simile:

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

Immagino che dovresti scrivere "val scheduler =" invece di "def scheduler =", altrimenti avrai più istanze di scheduler. –

+0

Inoltre è più efficiente eseguire l'override di executeFromActor (task: Runnable) ed eseguire (task: Runnable) immediatamente per pool: https://github.com/plokhotnyuk/actors/blob/master/src/test/scala/com /github/plokhotnyuk/actors/ScalaActorSpec.scala#L20 –

2

ma è abbastanza facile riutilizzare al pool di thread utilizzato dal sottosistema attore. In primo luogo è possibile controllare la sua dimensione:

-Dactors.maxPoolSize=8 

E si può richiamare il lavoro su di esso:

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

L'unica cosa che manca è la possibilità di pianificare il lavoro. Per questo io uso un separato ScheduledExecutorService che è a thread singolo e gira il suo lavoro sulla piscina attori filo:

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) 
    } 

} 

Quindi è possibile utilizzare questo per pianificare nulla:

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

Per Scala 2.8 .1 è:

scala -Dactors.corePoolSize=20 
Problemi correlati