2009-10-20 9 views
12

Mam istniejącą aplikację java/scala używającą globalnej puli wątków. Chciałbym rozpocząć korzystanie z aktorów w projekcie, ale chciałbym, aby wszystko w aplikacji korzystało z tej samej puli.Jak wyznaczyć pulę wątków dla aktorów

Wiem, że mogę ustawić maksymalną liczbę wątków, których używają aktorzy, ale wolałbym dzielić pulę wątków. Czy jest to konieczne/uzasadnione i czy można wyznaczyć pulę wątków aktora?

Jeśli nie jest to możliwe/zalecane, czy istnieją jakieś praktyczne reguły podczas integrowania aktorów w aplikacjach, które już używają wątków?

Dzięki.

Odpowiedz

7

Wierzę, że można zrobić coś takiego:

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

Domyślam się, że powinieneś napisać "val scheduler =" zamiast "def scheduler =", w przeciwnym razie będziesz miał wiele instancji schedulerów. –

+0

Skuteczniejsze jest także przesłonięcie funkcji executeFromActor (zadanie: Runnable) i wykonanie (task: Runnable), aby natychmiast wykonać ją przy użyciu puli: https://github.com/plokhotnyuk/actors/blob/master/src/test/scala/com /github/plokhotnyuk/actors/ScalaActorSpec.scala#L20 –

2

Ale to dość łatwe do ponownego korzystania z basenu nici użytej przez podsystem aktora. Po pierwsze można kontrolować jej rozmiar:

-Dactors.maxPoolSize=8 

I można powoływać się na nią prace:

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

Jedyne co brakuje jest zdolność do planowania pracy. Do tego używam oddzielnego ScheduledExecutorService który jest jednowątkowy i prowadzi prace nad basenem aktorzy wątku:

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

} 

Następnie można użyć tego, aby zaplanować coś:

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

dla Scala 2.8 .1 to:

scala -Dactors.corePoolSize=20 
Powiązane problemy