12
votes

Comment désigner une piscine de fil pour acteurs

J'ai une application Java / Scala existante en utilisant un pool de threads global. J'aimerais commencer à utiliser des acteurs du projet, mais j'aimerais tout dans l'application à l'aide du même piscine.

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

Si ce n'est pas possible / recommandé, existe-t-il des règles de pouce lors de l'intégration des acteurs des applications qui utilisent déjà des threads?

merci.


0 commentaires

3 Réponses :


7
votes

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


2 commentaires

Je suppose que vous devriez écrire "VAL Scheduler =" au lieu de "DEF Scheduler =", sinon vous aurez plusieurs instances de planificateurs.


De plus, il est plus efficace de remplacer ExecuteFromActor (tâche: exécutable) et exécuter (tâche: exécution) à exécuter immédiatement par piscine: github.com/plokhotnyuk/actors/blob/master/src/test/scala/com / ...



2
votes

Mais il est assez facile de réutiliser le piscine de thread utilisé par le sous-système Acteur. Tout d'abord, vous pouvez contrôler sa taille: xxx

et vous pouvez invoquer le travail dessus: xxx

La seule chose qu'il manque est la capacité de planifier le travail. Pour cela, j'utilise un séparé planchedexecutetorservice qui est fileté unique et exécute son travail sur le piscine de thread acteurs: xxx

Ensuite, vous pouvez utiliser ceci pour planifier n'importe quoi: xxx


0 commentaires

6
votes

pour scala 2.8.1 C'est:

scala -Dactors.corePoolSize=20


0 commentaires