Scala 如果我们不定义路由器,Akka Actor是否并行运行?
我不太清楚Akka系统中的路由器、调度器和执行器 如果我没有定义路由器,因此没有给它一个组actors,那么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
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是一个廉价的对象,它可以处理系统中的任何线程。这是非常重要的,因为许多参与者现在可以使用有限数量的线程来完成他们的工作