Play框架和线程池

6

Play框架对我的应用程序暴露的线程数量有限制吗?Play应用程序内部的线程大小非常珍贵吗?如果我在应用程序中使用自己创建的线程池而不是Play提供的线程池,这样做是否推荐?请问有人可以详细介绍一下Play如何处理线程吗?


有人愿意接受挑战吗?有什么建议吗? - joesan
1个回答

5

您的Play应用程序中线程的限制基本上要由分配给VM的最大内存确定。每个线程都会消耗相当多的内存,因为它们有自己的堆栈。实际上,可能的最大线程数取决于您将传递给JVM的参数和计算机上的总RAM等。

您应该让Play为您管理线程。配置文档位于这里。Play的设计部分涉及最小化所需的线程数量,因此,除非您执行了大量阻塞调用,否则不需要进行任何更改。

Play使用Akka来处理线程。可以在这里找到内部Actor系统的配置。其中精华部分是parallelism-factorparallelism-max。如果我们查看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.
parallelism-factor = 3.0

# Max number of threads to cap factor-based parallelism number to
parallelism-max = 64

根据参考配置,Play的parallelism-factor默认设置为1。这意味着,默认情况下,Play将具有等于可用处理器数量的线程池,最多达到24个。


如果我在阻塞操作中使用自己的ExecutionContext而不是Play的ExecutionContext会发生什么?这是一个好方法吗? - joesan
说实话,这并没有太大的区别,因为无论哪种方式,您都会使用线程。唯一需要做的事情是,如果您打算进行阻塞调用,则应使用配置增加Play的线程池大小。 - Jonathan Boudreau
看一下 monifu https://github.com/monifu/monifu/wiki/Schedulers 这个似乎使用了一个不同的执行上下文,可以独立于我从 Play 获取的线程池创建和生成线程? - joesan
我觉得我可能没有理解你的问题。 - Jonathan Boudreau
我的问题是,如果我使用提供的执行上下文创建自己的线程,那么谁控制这些线程?如果我生成的线程在我的Play服务器停止后仍然存在,会发生什么?这是一个好的实践吗? - joesan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接