2011-04-28 70 views
8

我有一個演員池,其中有100個運行Actor,它們共享一個工作,將其CorePoolSize設置爲100,但將現有的19個消息發送給其中一個演員時,19個消息不會並行化爲19個演員,但只有5個消息並行運行。當這5條消息完成後,接下來的5條消息再次由這些相同的5個角色處理,依此類推。爲什麼我的19條信息並行運行,我在這裏錯過了什麼?爲什麼我在Akka調度演員?

我的代碼基本上是這樣的:

object TestActor { 
    val dispatcher = Dispatchers.newExecutorBasedEventDrivenWorkStealingDispatcher("pool") 
        .setCorePoolSize(100) 
        .setMaxPoolSize(100) 
        .build 
} 

class TestActor(val name: Integer) extends Actor { 
    self.lifeCycle = Permanent 
    self.dispatcher = TestActor.dispatcher 
    def receive = { 
     case num: Integer => { println("Actor: " + name + " Received: " + num) 
           Thread.sleep(10000) 
          } 
    } 
} 

trait CyclicLoadBalancing extends LoadBalancer { this: Actor => 
    val testActors: List[ActorRef] 
    val seq = new CyclicIterator[ActorRef](testActors) 
} 

trait TestActorManager extends Actor { 
    self.lifeCycle = Permanent 
    self.faultHandler = OneForOneStrategy(List(classOf[Exception]), 5, 5000) 
    val testActors: List[ActorRef] 
    override def preStart = testActors foreach { self.startLink(_) } 
    override def postStop = self.shutdownLinkedActors() 
} 

val supervisor = actorOf(new TestActorManager with CyclicLoadBalancing { 
val testActors = (1 until 100 toList) map (i => actorOf(new TestActor(i))) 
}).start 

println("Number of Actors: " + Actor.registry.actorsFor(classOf[TestActor]).length) 

val testActor = Actor.registry.actorsFor(classOf[TestActor]).head 

(1 until 20 toList) foreach { testActor ! _ } 

輸出:

Actor: 4 Received: 16 
Actor: 3 Received: 17 
Actor: 1 Received: 19 
Actor: 59 Received: 1 
Actor: 2 Received: 18 

// 10 secs. are passing.. 

Actor: 4 Received: 15 
Actor: 3 Received: 14 
Actor: 1 Received: 13 
Actor: 59 Received: 2 
Actor: 2 Received: 12 

// 10 secs. are passing.. 

Actor: 4 Received: 11 
Actor: 3 Received: 10 
Actor: 59 Received: 3 
Actor: 2 Received: 8 
Actor: 1 Received: 9 

// 10 secs. are passing.. 

Actor: 4 Received: 7 
Actor: 3 Received: 6 
Actor: 59 Received: 4 
Actor: 2 Received: 5 

編輯:我使用阿卡1.0

+1

你支持多少個線程? – 2011-04-28 16:40:41

+0

我在哪裏可以找到?我基本上使用這個config.file:http://scalablesolutions.se/akka/docs/akka-0.10/configuration.html我試圖修改核心池大小因子配置,但這並沒有改變任何東西。但我認爲這是默認的調度員.. – rocksteady 2011-04-29 06:41:31

回答

2

我覺得調度允許您自定義的吞吐量性能。這定義了調度員應該在一次掃描中處理的特定Actor的消息數量。你可以在你的akka​​.conf文件

actor { 
    throughput = 20 
} 

添加以下配置默認情況下爲5個

+0

嗯,謝謝,試過,但我仍然有相同的行爲:( – rocksteady 2011-04-28 14:05:55

12

感謝您的詢問,我本地化瓶頸,它固定在此承諾阿卡大師:

https://github.com/akka/akka/commit/e4e99ef56399e892206ce4a46b9a9107da6c7770

將在阿卡1.1-RC1發佈

乾杯, √

+2

嗨,謝謝你,將檢查出:)而且也感謝在Akka偉大的工作,我'非常高興與框架到目前爲止:) – rocksteady 2011-04-29 13:03:24

+0

你是最受歡迎的,快樂hAkking! – 2011-05-01 09:59:06

+3

我的回答不可接受? – 2011-05-11 07:34:48