Scala 为什么我在阿克卡派演员的人数减少了?
我有一个由100名正在运行的演员组成的演员池,他们共享一个窃取工作的调度器,其CorePoolSize设置为100。但是现在,当向其中一个参与者发送19条消息时,19条消息没有与19个参与者并行,只有5条消息并行运行。当这5条消息完成后,接下来的5条消息将再次由这5个参与者处理,以此类推。为什么我的19条信息没有并行运行,我在这里遗漏了什么 我的代码基本上如下所示:Scala 为什么我在阿克卡派演员的人数减少了?,scala,akka,Scala,Akka,我有一个由100名正在运行的演员组成的演员池,他们共享一个窃取工作的调度器,其CorePoolSize设置为100。但是现在,当向其中一个参与者发送19条消息时,19条消息没有与19个参与者并行,只有5条消息并行运行。当这5条消息完成后,接下来的5条消息将再次由这5个参与者处理,以此类推。为什么我的19条信息没有并行运行,我在这里遗漏了什么 我的代码基本上如下所示: object TestActor { val dispatcher = Dispatchers.newExecutorBase
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
编辑:我使用的是Akka 1.0,我认为dispatcher允许您自定义吞吐量属性。这定义了调度器应在一次扫描中处理的特定参与者的消息数。您可以在akka.conf文件中添加以下配置
actor {
throughput = 20
}
默认值为5感谢您的询问,我将瓶颈定位并在提交给Akka master的过程中修复了它: 它将在Akka 1.1-RC1中发布 干杯,
√ 你用多少条线来支持它?我在哪里可以找到?我基本上使用的是这个config.file:我试图修改核心池大小因子配置,但没有改变任何东西。但我认为这是为默认调度程序准备的。……您好,谢谢,我会检查一下:)还感谢在Akka上所做的伟大工作,到目前为止,我对框架非常满意:)