multithreading - 当向服务器添加更多资源时,Play Framework会进行线程池扩展吗

标签 multithreading playframework playframework-2.0 playframework-2.3

我是新手,正在使用它进行同步数据库调用,并且有一些我不清楚或误解的地方;首先,在我的application.conf文件中,输入以下代码

play {
  akka {
    akka.loggers = ["akka.event.slf4j.Slf4jLogger"]
    loglevel = WARNING
    actor {
      default-dispatcher = {
        fork-join-executor {
          parallelism-min = 300
          parallelism-max = 300
        }
      }
    }
  }
}

我从https://www.playframework.com/documentation/2.3.x/ThreadPools那里获得的,并且还阅读了Play Framework and Threadpools。这意味着您始终有300个线程可用于阻止数据库操作?或每秒最多300个请求?如果我有更多的服务器资源,例如更多的Ram,CPU或内核,是否还会增加可用线程的数量?例如,如果我购买的服务器具有4个核心等,那么可用线程会跳到1,200吗?如前所述,我的所有操作都从用户注册到用户聊天,因此请尽力消除我的误解,以免造成更大的损失。

最佳答案

我还想知道整个Akka和线程的东西有一段时间了,所以我做了一些研究,这就是我想出的。希望对您有所帮助。

Play正在使用Akka进行线程管理和并发。这样做的好处是,您不再需要在应用程序编程过程中担心并发的麻烦。

Akka使用dispatchers来管理其参与者的处理器时间(参与者是Akka中实际计算的地方)。

Dispatchers are one of the most important parts of Akka.NET, as they control the throughput and time share for each of the actors, giving each one a fair share of resources.



Akka允许使用不同的调度程序,但是默认调度程序是“fork-join-executor”,这也是Play默认使用的调度程序。

在您的配置中,将最小和最大线程数设置为300。通过这种方式,您可以将线程数固定为300,因为您希望线程池很大,因为您有许多同步数据库调用。您有300个线程,与处理器的数量无关。如果您购买一台具有更多处理器的新服务器,那么它仍然是300个。

否则,如果不设置线程的最小和最大数量,则调度程序将按照available processors * parallelism-factor公式进行一些计算。当然,您也可以设置此并行度因子,以适应不同服务器的不同处理器数量。因此,如果将此并行因子设置为75,它将导致在具有4个处理器的服务器上最多容纳300个线程,而在具有8个处理器的服务器上最多容纳600个线程。

在Akka的源代码中,它记录为:

The parallelism factor is used to determine thread pool size using the following formula: ceil(available processors * factor). Resulting size is then bounded by the parallelism-min and parallelism-max values.



如果您想了解有关Akka和调度程序的更多信息,我向akka-concurrency-test推荐该文档,它本身有很好的资源列表。

关于multithreading - 当向服务器添加更多资源时,Play Framework会进行线程池扩展吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32912190/

相关文章:

java - 玩!没有正确关闭 H2

java - HBase - Playframework 获取 byte[] 值作为图像并将其显示在网站上

java - 在jpql中使用 "similar to"或 "~*"

Slick 的 Mysql 版本

scala - 将订户建模为 Akka Actor 的正确方法

java - 如何将线程行为限制为调用它们的方法?

java - 仅针对选定情况对 JDBC 连接进行多线程访问

Java同步类中的方法

C线程: SEGFAULT when trying to read thread's return value

playframework - Mailer-Plugin 未显示在应用程序的依赖项中