2017-04-07 2 views
1

私はBlockingタスク(ネットワークコール、レスポンスを待つ必要がある)を含むProject Reactorチェーンを持っています。複数のブロック作業を同時に実行したい。Blocking I/Oタスク用のParallelFluxとflatMap()との比較

それは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(); 

二つの技術のメリットは何ですか? 1つは他のものに優先されますか?選択肢はありますか?

答えて

4

parallelはあなたがrunOnに渡すSchedulerから、独自の実行コンテキストを取得し、それぞれが「レール」または「グループ」、間のパフォーマンスのために、タスクの並列化、および仕事の派遣に合わせて調整されます。簡単に言えば、CPUを集中的に使用すると、すべてのCPUコアが動作するようになります。しかし、あなたはI/Oバインドされた作業をしています...

したがって、あなたのケースでは、flatMapが良い候補です。並列化にflatMapを使用することは、オーケストレーションの詳細です。

flatMapというわずかに異なるフレーバーを数えない場合は、flatMapSequentialが(concatMapは実際には並列化が許可されていません)、これはかなり2つの選択肢です。

関連する問題