2009-10-20 7 views
12

J'ai une application java/scala existante en utilisant un pool de threads global. Je voudrais commencer à utiliser des acteurs dans le projet, mais je voudrais tout dans l'application en utilisant le même pool.Comment désigner un pool de threads pour les acteurs

Je sais que je peux définir le nombre maximum de threads que les acteurs utilisent mais que je préférerais partager le pool de threads. Est-ce nécessaire/raisonnable, et est-il possible de désigner le pool de threads de l'acteur?

Si ce n'est pas possible/recommandé, y a-t-il des règles de base pour intégrer des acteurs dans des applications qui utilisent déjà des threads?

Merci.

Répondre

7

Je crois que vous pouvez faire quelque chose comme ceci:

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

Je suppose que vous devriez écrire "val scheduler =" au lieu de "def scheduler =", sinon vous aurez plusieurs instances de planificateurs. –

+0

Il est également plus efficace de remplacer executeFromActor (tâche: Runnable) et d'exécuter (task: Runnable) pour exécuter immédiatement par pool: https://github.com/plokhotnyuk/actors/blob/master/src/test/scala/com /github/plokhotnyuk/actors/ScalaActorSpec.scala#L20 –

2

Mais il est assez facile de réutiliser le pool de threads utilisé par le sous-système de l'acteur. Tout d'abord, vous pouvez contrôler sa taille:

-Dactors.maxPoolSize=8 

Et vous pouvez invoquer le travail sur elle:

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

La seule chose qu'il manque est la capacité de planifier le travail. Pour cela, j'utilise un ScheduledExecutorService séparé qui est seul thread et exécute ses travaux sur les acteurs pool de threads:

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

} 

Ensuite, vous pouvez l'utiliser pour planifier quoi que ce soit:

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

Scala 2.8 .1 c'est:

scala -Dactors.corePoolSize=20 
Questions connexes