我有一个Project Reactor链,其中包含一个阻塞任务(网络调用,我们需要等待响应)。我想同时运行多个阻止任务。
似乎可以使用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();
这两种技术的优点是什么?一个比另一个更受欢迎吗?还有其他选择吗?
答案 0 :(得分:12)
parallel
专为性能并行化而定制,并在“rails”或“groups”之间调度工作,每个工作都从Scheduler
传递给runOn
获取自己的执行上下文{1}}。简而言之,如果您进行CPU密集型工作,它将使您的所有CPU内核都能正常工作。但是你正在进行I / O约束工作......
因此,在您的情况下,flatMap
是更好的候选人。使用flatMap
进行并行化更多的是关于编排。
如果您不计算flatMap
的{{1}}略有不同的风格(flatMapSequential
并不真正允许并行化),那么这几乎是两种选择。< / p>