gpt4 book ai didi

java - 每个应用程序一个(较大)线程池与每个应用程序组件多个(较小)线程池

转载 作者:行者123 更新时间:2023-11-30 07:19:16 27 4
gpt4 key购买 nike

一个应用程序托管一个具有三个接口(interface)的 Web 服务,用于三个单独且独立的操作,所有这些操作都在应用程序的不同组件中实现,彼此独立,例如在不同的包等中,所以他们对彼此了解不多,只共享应用程序范围的配置等。

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

原因是这样每个线程池都可以独立优化,具体取决于要处理的事物的负载和目的,并且已知用于哪个目的等。但实际上目前没有关心这些事情并使用合理的默认值反而。这意味着每个线程池例如限制为 5 个线程。如果需要所有池/线程,则可以不给系统施加过多负载,但如果不需要,则 10 核 CPU 中的某些内核可能未使用,即使一个用户提供了可以由 7/8/N 处理的数据核心并行。另一方面,当前的行为有点“保证”,如果没有做任何其他事情,每个任务总是至少有 5 个线程可用。

那么,每个应用程序只有一个线程池会更好吗,例如10个或15个或一些任意N个线程,而不是独立的线程池,以更动态地使用资源?

或者这是无法给出明确答案的事情,因为这些事情总是取决于许多变量,例如系统的总体负载,例如诸如备份、cron 报告、监控和安装更新等之类的东西,有多少用户调用了哪些接口(interface)等等。

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

最佳答案

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

  • 控制:如果您有一些具有更高优先级的任务,并且您希望增加这些任务运行的机会。您可以创建多个线程池并为具有更高优先级的线程池提供更多线程。
  • 争用:有多少任务正在运行?任务的执行速度有多快?如果答案多且快,那么拥有一个线程池可能会导致对单个工作队列的争用。相反,您可以对线程池进行 strip 化并分散争用。这本质上是 ForkJoinPool 所做的,每个线程都有自己的工作队列并以这种方式减少争用(也许您可以使用 FJP)。
  • 您不希望应用程序某一部分的任务干扰应用程序另一不相关部分的任务。想象一下,如果你有一些 Action A 可能需要一段时间,而另一个 B 不需要。将它们分开是有意义的,这样线程池就不会被所有正在运行的 A 任务消耗。它与(1)有更多的控制权和(2)减少竞争有关。

  • 否则,我认为您创建的线程池和线程的数量非常随意。

    编辑:添加了第三个用例

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

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com