【问题标题】:Is is more performant to use a singleton Executor service or function-specific executor service?使用单例执行器服务或特定功能的执行器服务性能更高吗?
【发布时间】:2021-08-03 00:39:59
【问题描述】:

我真正想弄清楚的是如何思考这个问题,或者从该领域更有经验的人那里获得一些见解。

假设这是 Web 服务中的单例类,例如 graphql 数据提取器。哪个在规模上表现更好:第一个还是第二个?或者会有什么性能差异?

public class FooBarClass {
    public List<Bar> getSomeStuff() {
            List<Bar> bar = new ArrayList<Bar>;

            final ExecutorService threadpool = Executors.newFixedThreadPool(10);

            //Get the stuff in multithreaded way.
            threadpool.shutdown();
            return bar;
        };
    }
}

public class FooBarClass {

    final ExecutorService threadpool = Executors.newFixedThreadPool(10); 

    public List<Bar> getSomeStuff() {
            //...
            //Get the stuff using the executor service.
            return bar;
        };
    }


}

我发现使用执行器服务肯定会加快代码速度。我们正在进行类似批处理的提取,但由于某些原因我们需要进行单次提取,所以所有提取都是异步的。

【问题讨论】:

    标签: java spring graphql


    【解决方案1】:

    这真的取决于。

    假设每个服务都有自己的 10 个线程池,假设有 50 个服务,那么总共有 500 个线程。

    当您有大量线程时(不一定是 500 大),很可能它们中的大多数大部分时间都是空闲的,这是相当浪费的。线程有开销,它们之间的上下文切换相对较慢。

    如果每个服务都有自己的池,可能会出现这样一种情况:一个服务的池完全用完,任务队列很大,而其他执行器完全空闲。在这些情况下,池可以合作并共享资源会更好。这是服务共享公共池的情况。

    与其他服务隔离有时也很好。任务有不同的优先级,您不希望琐碎的低优先级作业消耗所有线程,而让高优先级作业在队列中等待。这是每个服务都有自己的池的情况。

    在实践中,我发现最好的方法是在中间的某个地方。有些服务是高优先级的,我不希望这些服务受到应用程序其他地方发生的事情的影响。我给这些类型的服务一个专用的线程池。其他服务的优先级不高,我不在乎任务提交和执行之间是否存在小延迟。对于那些,我让它们共享一个公共线程池。

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 2014-09-07
      • 1970-01-01
      • 2023-01-16
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多