ブロッキングタスクを含むProjectReactorチェーンがあります(ネットワーク呼び出し、応答を待つ必要があります)。複数のブロッキングタスクを同時に実行したいのですが。
ParallelFluxまたはflatMap()のいずれかを使用できるようですが、必要最低限の例です。
Flux.just(1)
.repeat(10)
.parallel(3)
.runOn(Schedulers.elastic())
.doOnNext(i -> blockingTask())
.sequential()
.subscribe()
または
Flux.just(1)
.repeat(10)
.flatMap(i -> Mono.fromCallable(() -> {blockingTask(); return i;}).subscribeOn(Schedulers.elastic()), 3)
.subscribe();
2つのテクニックのメリットは何ですか?一方が他方よりも優先されますか?代替手段はありますか?
parallel
は、パフォーマンスを目的としたタスクの並列化、および「Rails」または「グループ」間での作業のディスパッチ用に調整されています。各グループは、Scheduler
に渡すrunOn
から独自の実行コンテキストを取得します。つまり、CPUを集中的に使用する作業を行うと、すべてのCPUコアが機能するようになります。しかし、あなたはI/Oバウンドの仕事をしています...
したがって、あなたの場合、flatMap
がより良い候補です。並列化のためのflatMap
の使用は、オーケストレーションに関するものです。
flatMap
とはわずかに異なるflatMapSequential
のフレーバーを数えない場合、これらはほぼ2つの選択肢です(concatMap
は実際には並列化を許可していません)。