【问题标题】:ThreadPoolTaskExecutor core and max pool sizeThreadPoolTask​​Executor 核心和最大池大小
【发布时间】:2022-06-19 16:23:46
【问题描述】:

我有一个 Spring Boot 应用程序,我们必须在其中对第 3 方 REST 服务进行一些 http 调用。我们可能需要打 1 个电话或数千个电话。

我正在使用 @Async Spring Boot 注释和 CompletableFuture,如下所示:

    long start = System.nanoTime();
    List<String> list = new ArrayList<>();
    List<CompletableFuture<List<String>>> allFutures = new ArrayList<>();
    for (int i = 0; i < 1000; i++) {
        allFutures.add(httpClient.getStringAsync("Hello"));
    }
    List<String> unwrappedFutures = allFutures.stream()
            .map(CompletableFuture::join)
            .flatMap(List::stream)
            .collect(Collectors.toList());

    list.addAll(unwrappedFutures);
    long duration = (System.nanoTime() - start) / 1_000_000;
    log.info("Done in {} msecs", duration);

此代码大约需要 2 分钟才能对有 1 秒延迟的 getStringAsync() 方法进行 1000k 次调用。

在“Runtime.getRuntime().availableProcessors()”显示有 12 个内核的笔记本电脑上或在内核数现在似乎只有一个的 EKS 集群上处理所需的时间相同。

我认为我必须配置 ThreadPoolTask​​Executor,以便可用的内核数量越多,处理时间就越短。

但是,我不确定如何确定核心、最大池大小和队列容量。

我想知道池大小是否必须等于列表中的项目数?也就是说,如果列表有 1000 个项目,这意味着我们必须对远程服务进行 1000 次调用,我们需要 1000 个线程吗?这似乎很多。

【问题讨论】:

    标签: java spring multithreading spring-boot completable-future


    【解决方案1】:

    添加我的发现:

    如果我将 ThreadPoolTask​​Executor 核心和最大大小设置为 12,这是我笔记本电脑上的核心数量,至少 Runtime.getRuntime().availableProcessors() 显示的是,1000K 调用平均为 1.4分钟。

    如果我将 ThreadPoolTask​​Executor 核心和最大大小设置为 100,则 1000K 调用平均在 10 秒内完成。

    如果我将 ThreadPoolTask​​Executor 核心和最大大小设置为 1000,则 1000K 调用平均在 1.4 秒内完成。这听起来很吸引人,但是我在我的笔记本电脑上做一个独立的测试,在真实场景中会有很多其他的事件正在处理,所以我认为这不是理想的。

    【讨论】:

      【解决方案2】:

      要优化执行,您应该让 ThreadPoolExecutor 的活动线程数至少等于可用内核数。将这个数字增加太多会适得其反,尤其是设置为 1000。线程只会使资源饱和并彼此减慢。

      事实上,forkJoinPool 类在池和工作线程方面共享ThreadPoolExecutor 的一些概念,在使用 no- args 构造函数。

      此可用内核数可通过Runtime 类获得。

      Runtime.getRuntime().availableProcessors()

      【讨论】:

      • @NathanHughes 你说得对,我的意思更多的是它们之间的相似之处,因为它们都实现了 Executor 和 ExecutorSerice 并共享一些概念。后来我读到这句话时,措辞不是很好。感谢您让我注意到!
      猜你喜欢
      • 2017-03-02
      • 2021-10-03
      • 2016-03-20
      • 2021-01-02
      • 2013-01-11
      • 2011-08-13
      • 1970-01-01
      • 2017-01-28
      • 2023-03-30
      相关资源
      最近更新 更多