我们在系统中有 2 个 ExecutionContext(Scala 2.11.4,Playframework 2.3.7)
- 主要上下文 - 用于系统操作工作(使用主要 Play ExecutionContext)。
- 管理 - 用于后端相关任务。
我在 application.configurations 中将它们分成两部分。
play {
akka {
akka.loggers = ["akka.event.slf4j.Slf4jLogger"]
loglevel = DEBUG
actor {
default-dispatcher = {
fork-join-executor {
parallelism-min = 20
parallelism-max = 20
}
}
}
}
}
contexts {
admin {
fork-join-executor {
parallelism-min = 30
parallelism-max = 30
}
}
}
有没有办法配置ThreadPool的优先级?
最佳答案
目前无法配置线程优先级,因为该设置在许多平台上几乎没有影响,因此可以作为安慰剂。如果您开始并积极使用比 CPU 内核更多的线程,那么由此产生的竞争将代价高昂并且会浪费资源,因此您最好仔细调整线程池大小以适应 CPU 绑定(bind)部分的可用内核。
贴出的配置例子让我疑惑:系统真的有30多个核心吗?否则 contexts.admin
调度程序无论如何都无法从优先级排序中获益。
最后只有一种方法可以为特定任务保留 CPU 时间,那就是永远不要将这些内核分配给任何其他任务(如果您正在编写低级 C 代码并使用Unix 实时优先级,但这很容易出错,而且胆小者不宜——犯错会使您无法进入系统)。
这意味着在一个有 24 个内核的系统上,它应该处理一些网络流量,与一些数据库对话并处理一些数字,例如,我会为数字处理创建一个大小为 16 的固定线程池,并为阻塞 DB 调用(根据最适合该 DB 的连接数确定大小,比如 40)加上处理网络和其他杂项的 Play 和 Akka 的正常调度程序(既不是阻塞也不是 CPU 密集型)。线程优先级不影响此图片。
关于scala - 如何在Play Framework中配置线程池优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28087783/