FlatMap何时会同时收听多个来源?

时间:2018-04-22 12:26:33

标签: java spring reactive-programming project-reactor reactive-streams

导致Flux::flatMap同时收听多个来源(0 ...无穷大)的情况是什么?

我在试验时发现,当上游向线程flatMap中的thread-upstream-1发送信号并且有N个内部流时,flatMap将侦听并且每个都发送信号在不同的主题:thread-inner-stream-i 1<=i<=N,而1<=i<=N thread-upstream-1 != thread-inner-stream-i flatMapdata_x = [1, 2, 3, 4] data_y = [2, 3, 4, 5] res = sum([a * b for a, b in zip(data_x, data_y )]) print(res) 将同时收听 < / strong>对所有内心流。

我认为这不完全正确,我错过了其他一些场景。

1 个答案:

答案 0 :(得分:1)

flatMap没有进行任何并行工作,例如:它不会更改线程。最简单的例子是

Flux.range(1, 5).hide()
    .flatMap(v -> Flux.range(10 * v, 2))
    .log()
    .blockLast(); //for test purpose

打印:

[main] INFO  reactor.Flux.FlatMap.1 - onSubscribe(FluxFlatMap.FlatMapMain)
[main] INFO  reactor.Flux.FlatMap.1 - request(unbounded)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(10)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(11)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(20)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(21)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(30)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(31)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(40)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(41)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(50)
[main] INFO  reactor.Flux.FlatMap.1 - onNext(51)
[main] INFO  reactor.Flux.FlatMap.1 - onComplete()

如您所见,仅在main中生成。如果在初始范围之后添加publishOn,则flatMap会生成相同单个线程中的所有内容,publishOn将切换到该位置。

flatMap 订阅对多个内部Publisher的影响是什么,最多为concurrency参数,默认值为Queues.SMALL_BUFFER_SIZE(256)

这意味着如果您将其设置为3,则flatMap会将3个源元素映射到其内部Publisher并订阅这些发布者,但会等待至少一个完成在它开始映射更多源元素之前。

如果内部Publisher使用publishOnsubscribeOn,那么flatMap自然会让他们的事件发生在当时定义的线程中:

Flux.range(1, 5).hide()
    .flatMap(v -> Flux.range(v * 10, 2)
                      .publishOn(Schedulers.newParallel("foo", 3)))
    .flatMap(v -> Flux.range(10 * v, 2))
    .log()
    .blockLast(); //for test purpose

打印哪些:

[main] INFO  reactor.Flux.FlatMap.1 - onSubscribe(FluxFlatMap.FlatMapMain)
[main] INFO  reactor.Flux.FlatMap.1 - request(unbounded)
[foo-1] INFO  reactor.Flux.FlatMap.1 - onNext(10)
[foo-1] INFO  reactor.Flux.FlatMap.1 - onNext(11)
[foo-1] INFO  reactor.Flux.FlatMap.1 - onNext(20)
[foo-1] INFO  reactor.Flux.FlatMap.1 - onNext(21)
[foo-1] INFO  reactor.Flux.FlatMap.1 - onNext(30)
[foo-1] INFO  reactor.Flux.FlatMap.1 - onNext(31)
[foo-4] INFO  reactor.Flux.FlatMap.1 - onNext(50)
[foo-4] INFO  reactor.Flux.FlatMap.1 - onNext(51)
[foo-4] INFO  reactor.Flux.FlatMap.1 - onNext(40)
[foo-4] INFO  reactor.Flux.FlatMap.1 - onNext(41)
[foo-4] INFO  reactor.Flux.FlatMap.1 - onComplete()