Scala 如果我们不定义路由器,Akka Actor是否并行运行?

Scala 如果我们不定义路由器,Akka Actor是否并行运行?,scala,akka,actor,Scala,Akka,Actor,我不太清楚Akka系统中的路由器、调度器和执行器 如果我没有定义路由器,因此没有给它一个组actors,那么actor是否并行运行 如果我没有定义路由器,而是将调度程序定义为并使用为: my-dispatcher { type = Dispatcher executor = "fork-join-executor" fork-join-executor { parallelism-min = 2 parallelism-factor = 2.0 paralle

我不太清楚Akka系统中的路由器、调度器和执行器

如果我没有定义路由器,因此没有给它一个组actors,那么actor是否并行运行

如果我没有定义路由器,而是将调度程序定义为并使用为:

my-dispatcher {
  type = Dispatcher
  executor = "fork-join-executor"
  fork-join-executor {
    parallelism-min = 2
    parallelism-factor = 2.0
    parallelism-max = 10
  }
  throughput = 100
}
演员是否并行运行

如果我没有定义路由器,因此没有给它一个组 演员,演员是否平行

Actor系统中的Dispatcher是
ExecutionContext
上的包装器,它有一个执行Actor的底层线程池。如果您创建的只是一个参与者并将消息传递给它,那么所有消息都将到达同一个参与者邮箱,他将逐个处理该邮箱。参与者内部的执行是同步进行的

如果您希望多个参与者处理一个请求,那么这正是路由器的用途。如果您希望有一组参与者可以处理相同的请求,那么您可以分配一个路由器,它将为您管理参与者组,并注意哪个参与者获得了多少工作量

例如,当您有一个路由器,并且您定义了一个内部参与者池,即
RoundRobinPool
,它只是以循环方式将消息分配给参与者邮箱:

context.actorOf(
  Props(new MyActor())
    .withRouter(RoundRobinPool(nrOfInstances = 10)), name = "MyRouter")
这将创建一个带有
RoundRobinPool
路由器,该路由器包含10个参与者。

消息在参与者内部连续执行

这就是为什么说“一个演员不是演员”

向参与者发送消息时。它落在演员邮箱里。邮箱中的邮件以串行方式逐个处理。这里需要注意的一件重要事情是,actor确保每个消息行为都在一个线程中执行—它可以是不同的线程


所以路由器会创建一组参与者,并将消息路由到一组参与者,以便每个参与者以并行方式同时处理它

谢谢你的回答,但我需要知道更多。如果我创建一个路由器,使用池大小为10的
RoundRobinPool
,并将
parallelism max
设置为8,那么我将得到10个或8个并行运行的actor实例?@Stephen您将得到10个共享8个线程的线程池的actor。这意味着最多8个并行运行的实例,对吗?@Stephen如果你有足够的流量让你的8个演员同时工作,那么是的。每个参与者都需要一个线程来处理数据。@Stephen线程不是永久分配给参与者的。这就是线程池的意义所在,您使用一个线程,完成工作并将其返回到池中供其他人使用。线程仍然是您的执行单元,您需要它们来获得处理的时间片。谢谢。我已经多次阅读“actor确保每个消息行为在单个线程中执行,它可能是不同的线程”,但我不明白为什么必须解决“它可能是不同的线程”的概念?它会影响我们的应用程序吗?@Stephen…Actor是计算的容器。。。这个容器可以自由选择。。任何要计算的空闲线程。。。这就是我的想法。Idea是一个廉价的对象,它可以处理系统中的任何线程。这是非常重要的,因为许多参与者现在可以使用有限数量的线程来完成他们的工作