【问题标题】:Difference between publishOn and parallelpublishOn 和并行之间的区别
【发布时间】:2018-02-08 00:03:24
【问题描述】:

publishOnparallel 有什么区别?据我了解publishOn 通过使用几个线程执行它来影响运算符链的进一步处理。但是parallel 的工作方式似乎与它完全相同。默认情况下,它会创建一个大小为 == #cores 的线程池,并以相同的方式处理操作员的链。还是我遗漏了一些微妙之处?

Schedulers 部分指出:

[publishOn] 从上游获取信号并在下游重播它们,同时从关联的调度程序对工作人员执行回调

和,

为并行工作调整的固定工作池(Schedulers.parallel())。它会创建与 CPU 内核一样多的工作线程。

因此publishOn(Schedulers.parallel() 会创建尽可能多的线程作为核心,并与这些工作线程一起执行链中的后续operators

但随后Parralel 部分指出:

您可以在任何 Flux 上使用 parallel() 运算符。就其本身而言,此方法不会并行化工作。相反,它将工作负载划分为“rails”(默认情况下,rails 的数量与 CPU 内核的数量一样多)。

为了告诉生成的 ParallelFlux 在哪里执行每个轨道 (并且,通过扩展,并行执行rails)你必须使用 运行(调度程序)。请注意,有一个推荐的专用调度程序 对于并行工作:Schedulers.parallel()。

下面两个例子:

Flux.range(1, 10)
    .parallel(2)
    .runOn(Schedulers.parallel())
    .subscribe(i -> System.out.println(Thread.currentThread().getName() + " -> " + i));

Flux.range(1, 10)
    .publishOn(Schedulers.parallel())
    .subscribe(i -> System.out.println(Thread.currentThread().getName() + " -> " + i));

假设计算机有两个内核,以上两个示例是否等效?

【问题讨论】:

    标签: java multithreading parallel-processing reactive-programming project-reactor


    【解决方案1】:

    认为我有这个答案。

    经过一些测试,我发现publishOn(Schedulers.parallel() 将在单独的线程上按顺序处理您的Flux

    但是,

    使用parallel().runOn(Schedulers.parallel()) 会将您的Flux 拆分为您拥有的核心数量,并且这些新的Fluxes 中的每一个都将被并行处理。因此,每个新的Fluxes 中的数据可能会按顺序处理,但Fluxes 一起将是并行处理。

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 2015-10-24
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      相关资源
      最近更新 更多