Configuring Spring Batch Steps in Parallel (Split) using Annotations の回答では、例(FlowJobBuilderTests.java)が与えられます。スプリングブートバッチ:CPUパフォーマンス最適化例
質問:この回答はパフォーマンスの最適化には本当に適していますか? (実行するには長時間CPUを消費するタスクがあり、最適な方法で使用可能なCPUを使用する必要があります)
Configuring Spring Batch Steps in Parallel (Split) using Annotations の回答では、例(FlowJobBuilderTests.java)が与えられます。スプリングブートバッチ:CPUパフォーマンス最適化例
質問:この回答はパフォーマンスの最適化には本当に適していますか? (実行するには長時間CPUを消費するタスクがあり、最適な方法で使用可能なCPUを使用する必要があります)
は例が実際にスレッドを使用することを示しています。従って、この例は適切である。さまざまなスレッドを使用しています
もう一つの良い例です:アシュラフSarhanによって
https://examples.javacodegeeks.com/enterprise-java/spring/batch/spring-batch-multithreading-example/。
例はSimpleAsyncTaskExecutorを使用しています。
のJavadoc:
注:この実装は、スレッドを再利用していません!その代わりに、特に多数の短命のタスクを実行するために、スレッドプールのTaskExecutor実装を考慮してください。
したがって、CPU使用率をより効率的にするために、私はむしろThreadPoolTaskExecutor or ConcurrentTaskExecutorを使用します。
あなたのタスクはCPUに束縛されているので、スレッドプールのサイズは、実行するマシン上のCPUコアの量に設定します。そのため、スレッドを切り替える際にCPUサイクルが無駄にならないようにします。コメント
(CPUがIO操作を待っているされないように、より大きなスレッドプールのサイズを持つことは、IOバウンドのタスクに適しているであろう)
反応:
今、私はより良いあなたの懸念を理解します。はい、ステップを並行して実行できます。ここでexample from my book about enterprise Springです:
@Bean
public Job prepareTeaJob(JobBuilderFactory jobBuilderFactory,
@Qualifier("boilWaterStep") Step boilWaterStep,
@Qualifier("addTeaStep") Step addTeaStep,
@Qualifier("addSugarStep") Step addSugarStep,
@Qualifier("addWaterStep") Step addWaterStep,
TaskExecutor customTaskExecutor) {
Job job = jobBuilderFactory.get("prepareTeaJob")
.start(boilWaterStep)
.split(customTaskExecutor)
.add(new FlowBuilder<Flow>("addIngredientsSplit")
.from(boilWaterStep).next(addTeaStep)
.from(boilWaterStep).next(addSugarStep)
.end())
.next(addWaterStep)
.end()
.build();
return job;
}
}
この例からaddTeaStep
とaddSugarStep
が右boilWaterStep
後、並列に実行されます。ステップで
Thread thread = Thread.currentThread();
System.out.println(thread);
を使用して
ありがとうございました。しかし、@Michael Minellaによって与えられた例が正しく理解されていれば、SimpleAsyncTaskExecutorも新しいスレッドを開始するので、すべてのステップが並行して実行されます。または私は間違っていますか? – user2145488
私は自分の答えを更新しました。 – luboskrnac
@luboskmac、残念ながら、あなたの解決策では、 'Thread thread = Thread.currentThread();' System.out.println(thread); ' はただ1つのスレッドを表示します。これは本当に最適化された方法でCPUを使用していますか? – user2145488