web-dev-qa-db-ja.com

ProjectReactorの並列実行

Project Reactor 3.1.5.RELEASE

このことを考慮:

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

サブスクライバーが複数のスレッドで実行されることを期待していますが、実行されるのは1つだけです。

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

ドキュメントには、私の期待が正しいことが示されています( http://projectreactor.io/docs/core/release/reference/#threading )。誰かがそこで何が起こっているのか説明してもらえますか?

5
Mikhail Kadan

リアクティブフローは本質的にシーケンシャルであり、publishOnは、各値を次々に発行する場所をソースに指示するだけです。フローにparallelを介して並列化するように指示し、次にrunOnを介してスケジューラーを指定する必要があります。

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