24

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

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

4

1 回答 1

24

parallel专为性能目的的任务并行化以及“rails”或“groups”之间的工作分派而定制,每个“rails”或“groups”都从Scheduler您传递到的runOn. 简而言之,如果您进行 CPU 密集型工作,它将使您的所有 CPU 内核工作。但是你正在做 I/O 绑定的工作......

所以在你的情况下,flatMap是一个更好的候选人。用于flatMap并行化更多的是关于编排。

flatMap如果您不计算略有不同的风味,那么这些几乎是两种选择flatMapSequentialconcatMap实际上不允许并行化)。

于 2017-04-07T09:01:10.203 回答