Akka-调度员

时间:2019-06-13 03:23:38

标签: multithreading scala concurrency akka

我一直在阅读文档,但是对于每个演员只有一个Dispatcher还是只有一个,我还是不太清楚。可以说我有演员SendSmsActor和演员UpdateSmsActor,他们都将使用默认调度程序吗?还是每个Actor都会获得自己的默认调度程序实例?同样,对于我来说,是否还有500个传入请求(作为批处理的一部分),并且我的parallelism-max设置为300,这300个线程是否会在SendSmsActor和UpdateSmsActor之间分配?

2 个答案:

答案 0 :(得分:1)

默认情况下,Akka使用默认的调度程序在线程上执行角色。 dispatcher对于Actor System中的所有参与者都是通用的。 Akka还提供了编写自定义调度程序的选项。您可以在调度程序中指定执行程序的类型。

线程不会在参与者之间分配。调度程序中可用的任何可用线程都将用于执行给参与者

默认调度程序配置为:

default-dispatcher {
type = "Dispatcher"
executor = "fork-join-executor"

fork-join-executor {
    parallelism-min = 8
    parallelism-factor = 3.0
    parallelism-max = 64
}

thread-pool-executor {
    keep-alive-time = 60s
    core-pool-size-min = 8
    core-pool-size-factor = 3.0
    core-pool-size-max = 64
    max-pool-size-min = 8
    max-pool-size-factor  = 3.0
    max-pool-size-max = 64
    task-queue-size = -1
    task-queue-type = "linked"

    allow-core-timeout = on
}

}

参考:What are the default Akka dispatcher configuration values?

答案 1 :(得分:1)

除非您通过配置或编程方式为actor实例显式分配替代调度程序,否则两个actor都将在默认调度程序上执行。

默认的fork-join调度程序将在线程之间平衡Actor的负载。但是,throughput选项将确定每个角色在切换到另一个角色之前应处理多少条消息。

取决于您的工作量,300个调度程序线程可能是最佳选择,也可能不是最佳选择。如果您的参与者是完全非阻塞的,那么您可能希望每个CPU核心大约有1个线程作为起点,然后进行一些基准测试以微调该数字。否则,您将浪费CPU周期进行不必要的上下文切换。如果您的actor阻止了,那么您可能想提供一个单独的调度程序,并将您的阻止actor配置为使用该调度器。参见Blocking Needs Careful Management