publishOn和parallel之间的区别

时间:2017-08-30 10:09:58

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

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

Schedulers部分声明:

  

[publishOn]从上游获取信号并在从关联的调度程序执行工作程序的回调时向下游重放它们

和,

  

为并行工作而调整的固定工作池(Schedulers.parallel())。它创建了与CPU核心一样多的工作者。

因此publishOn(Schedulers.parallel()创建了多个线程作为核心,并在这些工作者的链中执行后续operators

但是Parralel部分指出:

  

你可以在任何Flux上使用parallel()运算符。就其本身而言,这种方法并不能使工作并行化。相反,它将工作量分为" rails" (默认情况下,与CPU核心一样多的轨道。)

     

为了告诉生成的ParallelFlux执行每个轨道的位置   (并且,通过扩展,并行执行rails)你必须使用   的RunOn(调度器)。请注意,有一个推荐的专用调度程序   并行工作: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));

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

1 个答案:

答案 0 :(得分:0)

认为我对此有答案。

经过一些测试,我发现[DllImport("user32.dll", EntryPoint = "DdeInitialize")] public static extern int DdeInitialize(out uint pidInst, IntPtr pfnCallback, IntPtr afCmd, IntPtr ulRes); [DllImport("user32.dll", EntryPoint = "DdeConnect")] private static extern IntPtr DdeConnect(uint idInst, IntPtr hszService, IntPtr hszTopic, IntPtr pCC); [DllImport("user32.dll", EntryPoint = "DdeCreateStringHandle")] private static extern IntPtr DdeCreateStringHandle(uint idInst, string psz, int iCodePage); public Form1() { InitializeComponent(); Process application = new Process(); application.StartInfo.FileName = @"C:\Users\xxx\Desktop\DDE_Client.xlsx"; application.Start(); uint instId; DdeInitialize(out instId, application.MainWindowHandle, IntPtr.Zero, IntPtr.Zero); IntPtr sPtr = DdeCreateStringHandle(instId, "Excel", 1004); IntPtr tPtr = DdeCreateStringHandle(instId, "Sheet1", 1004); IntPtr channel = DdeConnect(instId, sPtr, tPtr, (IntPtr)null); } 将在单独的线程上按顺序处理publishOn(Schedulers.parallel()

但是

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