用于阻塞I / O任务的ParallelFlux与flatMap()

时间:2017-04-07 03:44:53

标签: project-reactor reactive-streams

我有一个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();

这两种技术的优点是什么?一个比另一个更受欢迎吗?还有其他选择吗?

1 个答案:

答案 0 :(得分:12)

parallel专为性能并行化而定制,并在“rails”或“groups”之间调度工作,每个工作都从Scheduler传递给runOn获取自己的执行上下文{1}}。简而言之,如果您进行CPU密集型工作,它将使您的所有CPU内核都能正常工作。但是你正在进行I / O约束工作......

因此,在您的情况下,flatMap是更好的候选人。使用flatMap进行并行化更多的是关于编排。

如果您不计算flatMap的{​​{1}}略有不同的风格(flatMapSequential并不真正允许并行化),那么这几乎是两种选择。< / p>