Java 项目反应器并行执行
项目反应堆3.1.5.1发布 考虑这一点: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
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的行为方式相同。否则,这取决于哪个更好。关于在平行图和平面图之间进行选择,请参见以下答案: