2017-04-07 188 views
1

我有一個包含阻塞任務(網絡調用,我們需要等待響應)的Project Reactor鏈。我想同時運行多個阻塞任務。ParallelFlux vs flatMap()用於阻塞I/O任務

好像無論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(); 

什麼是這兩種技術的優劣?一個比另一個更受歡迎嗎?有沒有其他的選擇?

回答

4

parallel被用於提高性能的目的任務的並行化,而「軌道」或「集團」,其中的每一個得到傳遞給runOnScheduler自己的執行上下文之間的工作調度量身定做。簡而言之,如果您執行CPU密集型工作,它將使您的所有CPU內核都能正常工作。但你正在做I/O綁定工作...

所以在你的情況下,flatMap是一個更好的候選人。並行化使用flatMap更多關於協調。

這幾乎是2種選擇,如果你不計算flatMap的略有不同的味道flatMapSequential是(concatMap並不真正允許並行化)。