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

标签 scala concurrency playframework akka threadpool

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

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

我在 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/

相关文章:

scala - Scala 中的更大循环

linq-to-sql - Linq to SQL 和 Rob Conery 存储库模式的并发性

java - LinkedBlockingQueue 在生产者-消费者场景中具有许多生产者的线程安全性

java - 在迭代器内的线程内删除集合的元素

playframework - 如何在 Play 中管理与数据库相关的异常! 2.0/Scala 使用 Anorm

scala - 是否有将 Future[Reader[A, X]] 转换为 Reader[A, Future[X]] 的通用方法?

mongodb - ReactiveMongo:使用游标[BSONObjectID]查找查询

scala - 如何在Spark DataFrame,Scala中将行转换为列

java - 在 IntelliJ IDEA 中,Play 框架反向路由期望 Nothing 作为参数

java - 在 Play Framework 中导入 Jar 会出现 java.lang.ClassCastException