【发布时间】:2018-02-08 00:03:24
【问题描述】:
publishOn 和 parallel 有什么区别?据我了解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