一个应用程序托管一个具有三个接口的Web服务,用于三个独立的动作,所有这些动作均在应用程序的不同组件中实现,彼此独立,例如使用不同的软件包等,因此他们彼此之间的了解并不多,只共享整个应用范围的配置等。

每个用户用所有数据调用所有这些接口,并且能够至少部分独立地处理这些数据,这就是为什么我目前使用三个线程池进行处理,每个组件一个。

原因是这样可以根据负载和要处理的事物的目的独立地优化每个线程池,并且已知该线程池是用于哪个目的等的。但是实际上,当前实际上并不关心此类事物并使用合理的默认值代替。这意味着每个线程池例如限制为5个线程。如果需要所有池/线程,则可以在系统上不增加过多负载,这是可以的,但是如果不需要,则即使一个用户提供了可以由7/8 / N处理的数据,也可能没有使用10核CPU中的某些核。核心并行。另一方面,当前的行为在某种程度上“保证”了如果不执行任何其他操作,则每个任务始终至少有5个线程可用。

因此,最好每个应用程序始终仅拥有一个线程池,例如10或15个或任意N个线程(而不是独立的线程池)来更动态地使用资源?

还是这是无法确定的答案,因为这样的事情总是取决于许多变量,例如一般来说系统的整体负载,例如诸如备份,cron报告和监视,安装更新等内容,到底有多少用户调用哪个界面等等。

我的问题有点类似于an already existing one,但不是一个重复的问题,因为它不关注一个具体任务,而是整个应用程序及其可维护性。这只是我反复问自己的一个问题,例如当我最初只有一个池,甚至增加了10个池时。

最佳答案

如我所见,有三个原因会拆分为多个线程池。两者都可能不适用于您的用例。


控制:如果您有一些优先级更高的任务,并且希望增加这些任务运行的机会。您可以创建多个线程池,并为优先级更高的线程分配更多线程。
争论:正在运行多少个任务?任务执行速度有多快?如果答案很多且很快,那么拥有一个线程池可能导致在单个工作程序队列上发生争用。取而代之的是,您可以对线程池进行分条处理,并使争用分散。本质上,这就是ForkJoinPool所做的事情,每个线程都有自己的工作队列,并以此方式减少了争用(也许可以使用FJP)。
您不希望应用程序某一部分中的任务干扰应用程序另一部分中无关的任务。想象一下,如果您有一些动作A需要花费一段时间,而另一个B则不需要。最好将这些中断,以便所有正在运行的A任务都不会占用线程池。它与(1)有更多的控制权和(2)减少竞争有关。


否则,我认为您创建的线程池和线程数几乎是任意的。

编辑:添加了第三个用例

关于java - 每个应用程序一个(大型)线程池,而每个应用程序组件多个(较小)线程池,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37860725/

10-09 05:11