Java 项目反应器并行执行

Java 项目反应器并行执行,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,项目反应堆3.1.5.1发布 考虑这一点: Flux.range(0, 10) .publishOn(Schedulers.parallel()) .subscribe(i -> LOG.info(i)); 我希望订阅服务器在多个线程中运行,但它只在一个线程中运行: 2018-03-26 12:30:08.693 INFO 89770 --- [ parallel-1] d.a.Application : 0 2018-03-26 12:30:08.693

项目反应堆3.1.5.1发布

考虑这一点:

Flux.range(0, 10)
    .publishOn(Schedulers.parallel())
    .subscribe(i -> LOG.info(i));
我希望订阅服务器在多个线程中运行,但它只在一个线程中运行:

2018-03-26 12:30:08.693  INFO 89770 --- [     parallel-1] d.a.Application    : 0
2018-03-26 12:30:08.693  INFO 89770 --- [     parallel-1] d.a.Application    : 1
2018-03-26 12:30:08.693  INFO 89770 --- [     parallel-1] d.a.Application    : 2
2018-03-26 12:30:08.693  INFO 89770 --- [     parallel-1] d.a.Application    : 3
2018-03-26 12:30:08.694  INFO 89770 --- [     parallel-1] d.a.Application    : 4
2018-03-26 12:30:08.694  INFO 89770 --- [     parallel-1] d.a.Application    : 5
2018-03-26 12:30:08.694  INFO 89770 --- [     parallel-1] d.a.Application    : 6
2018-03-26 12:30:08.694  INFO 89770 --- [     parallel-1] d.a.Application    : 7
2018-03-26 12:30:08.694  INFO 89770 --- [     parallel-1] d.a.Application    : 8
2018-03-26 12:30:08.694  INFO 89770 --- [     parallel-1] d.a.Application    : 9

文档表明我的期望是正确的()。有人能给我解释一下那里发生了什么吗?

反应流本质上是连续的,
publishOn
只是一个接一个地告诉源在哪里发出每个值。您需要通过
parallel
通知流并行,然后通过
runOn
指定调度程序:

Flux.range(0, 10)
.parallel()
.runOn(Schedulers.parallel())
.doOnNext(i -> LOG.info(i))
.sequential()
.subscribe();

这很有效,谢谢你。如果我没有弄错的话,这种顺序行为是由反应堆设计的,而且不仅仅是针对
Flux.just()
/
Flux.range()
/等等。所以我实际上应该期望每个
发布者(例如从第三方库返回的)都是顺序的,并通过调用
parallel().runOn()
,强制它在并行模式下工作?或者使用
flatMap()
subscribeOn()
是更好的方法,我不知道在这种情况下哪一种是最佳做法?不,这是一种通用的反应流设计;RxJava的行为方式相同。否则,这取决于哪个更好。关于在平行图和平面图之间进行选择,请参见以下答案: