8

CorePoolSizeが100に設定されたワークスティーリングディスパッチャーを共有する100の実行中のアクターのアクタープールがあります。しかし、アクターの1つに19のメッセージを送信すると、19のメッセージが19のアクターに並列化されず、実行中のメッセージは5つだけになります。並行して。これらの5つのメッセージが終了すると、次の5つのメッセージはこれらの同じ5つのアクターによって再度処理されます。19個のメッセージが並行して実行されないのはなぜですか、ここで何が欠けていますか?

私のコードは基本的に次のようになります。

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

編集:私はAkka1.0を使用しています

4

2 に答える 2

12

お問い合わせいただきありがとうございます。ボトルネックをローカライズし、Akka マスターへのこのコミットで修正しました。

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

Akka 1.1-RC1 でリリースされます

乾杯、√</p>

于 2011-04-29T12:44:33.780 に答える
2

ディスパッチャを使用すると、スループットプロパティをカスタマイズできると思います。これは、ディスパッチャが1回のスイープで処理する必要がある特定のアクターのメッセージの数を定義します。akka.confファイルに次の構成を追加できます

actor {
  throughput = 20
}

デフォルトでは5です

于 2011-04-28T13:41:57.187 に答える