为什么在单独的线程池中将阻塞与非阻塞操作分开比在一个中执行all更好?

时间:2015-01-22 10:38:53

标签: java multithreading playframework playframework-2.0 akka

我一直在Play中阅读有关线程池(https://www.playframework.com/documentation/2.1.0/ThreadPools)的Play Framework文档,但不知何故,我无法对某些事情进行数学计算。也许,你可以帮助我。

文档说,在阻塞和非阻塞调用之间维护桃的最佳做法是拥有多个线程池,并且每个特定类型的操作使用一个。在非阻塞操作的情况下,理想的线程池将为每个核执行1个线程,因此线程的最大值将非常低。对于阻塞操作(例如重型关系数据库调用),更好的方法是拥有一个允许每个核心有许多可用线程的大型线程池。

我没有看到数学点击是,如果我们想象我们在4核机器上运行应用程序,那么主动运行的线程的最大值是4.这意味着如果4个线程占用了时间 - 消耗数据库操作,我的非阻塞操作也将很难执行,直到阻塞操作消失。

因此,我的问题是运行两个单独的线程池的真正好处是什么,而不是一个中等大的线程池。我错过了什么?

1 个答案:

答案 0 :(得分:5)

被阻止的线程不会阻塞核心。

线程被阻止时,它会放弃正在运行的核心,使该核心可用于运行另一个线程。因此,如果有可用的非阻塞操作,则可以在不同的线程上继续操作。

使用单独的线程池的原因是,阻塞操作可能会耗尽池中的所有可用线程,因此没有可用于非阻塞操作的线程池。通过使用单独的池进行非阻塞操作,您可以帮助确保有可用的线程来利用阻塞操作不会持续使用的核心。