【问题标题】:What is the maximum Thread Size for SimpleAsyncTaskExecutor? - Spring BatchSimpleAsyncTaskExecutor 的最大线程大小是多少? - 春季批次
【发布时间】:2020-03-23 16:37:12
【问题描述】:

我需要运行一项大型迁移工作并转换大量数据。 出于这个原因,我实现了 SimpleAsyncTaskExecutor...

ConcurrencyLimit 有什么最佳实践吗?

public final String THREAD_MAX = 10;

@Bean
public TaskExecutor taskExecutor() {
       SimpleAsyncTaskExecutor asyncTaskExecutor = new SimpleAsyncTaskExecutor("spring_batch");
       asyncTaskExecutor.setConcurrencyLimit(THREAD_MAX);

       return asyncTaskExecutor;
}

【问题讨论】:

  • “我实现了 SimpleAsyncTaskExecutor”是什么意思?你的意思是你在你的 JobLauncher 中使用它?如果是这种情况,我真的建议使用ThreadPoolTaskExecutor,因为SimpleAsyncTaskExecutor 确实重用线程:docs.spring.io/spring/docs/current/javadoc-api/org/…

标签: spring multithreading spring-batch


【解决方案1】:

这在很大程度上取决于您生成的负载类型。它主要是 CPU 限制还是 IO 限制?

如果它受 CPU 限制,那么如果您的线程数多于 CPU 内核数,您将不会获得任何收益。实际上,你会因为不必要的上下文切换和无用的调度开销而失败。

如果是 IO 限制,您需要试验一下,考虑到您的硬件设置和确切的负载类型,并行性的最佳点是产生最高吞吐量。我会从低个位数的线程数开始,然后继续加倍以快速了解吞吐量如何随线程数变化。如果您的最佳结果是使用相当少的线程数,请不要感到惊讶。

【讨论】:

  • 好的,谢谢。所以设置 cpu 计数是个好主意,我猜 =)
  • 如果您将 cpu 计数设置为线程计数,并且在运行作业时,所有内核始终 100% 忙碌,那么这是您可以达到的最大值。
猜你喜欢
  • 2014-10-13
  • 2019-08-05
  • 2014-01-19
  • 1970-01-01
  • 2023-03-31
  • 2014-08-05
  • 1970-01-01
  • 2013-02-26
  • 2012-06-30
相关资源
最近更新 更多