如何在Play Framework中配置线程池优先级

How to configure ThreadPool priority in Playframework

我们在系统中有 2 个 ExecutionContext(Scala 2.11.4,Playframework 2.3.7)

  1. 主要上下文 - 用于系统操作工作(使用主要 Play ExecutionContext)。
  2. 管理 - 用于后端相关任务。

我在 application.configurations 中将它们分成了 2 个。

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
    }
  }
}

有没有办法配置线程池的优先级?

目前无法配置线程优先级,因为该设置在许多平台上几乎没有影响,因此可以作为安慰剂。如果您开始并积极使用比 CPU 核心更多的线程,那么由此产生的竞争将代价高昂并且会浪费资源,因此您最好仔细调整您的线程池大小以适应 CPU 的可用核心]-绑定部分。

贴出来的配置例子让我疑惑:系统真的有30多核吗?否则 contexts.admin 调度员无论如何都无法从优先级排序中获利。

最后只有一种方法可以为特定任务保留 CPU 时间,那就是永远不要将这些核心用于任何其他任务(如果你写得低,会有其他方法级别的 C 代码和使用 Unix 实时优先级,但这很容易出错,而且胆小者不适合——犯错误会把你锁在系统之外)。

这意味着在一个有 24 个内核的系统上,它应该处理一些网络流量,与一些数据库交谈并处理一些数字,例如,我会为数字处理创建一个大小为 16 的固定线程池和一个线程池对于阻塞的数据库调用(根据最适合该数据库的连接数确定大小,比如 40)加上处理网络的 Play 和 Akka 的正常调度程序和其他杂项(既不阻塞也不 CPU密集的)。线程优先级不影响此图片。