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



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

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

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

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

阻塞的线程不会阻塞内核。

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

使用单独线程池的

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

最新更新