线程调度程序,可以在同一个驱动器上批量文件操作到同一个线程?

时间:2013-04-04 22:57:30

标签: .net parallel-processing system.reactive

我想使用Rx扩展来处理长文件绑定操作的并行化。

工作流程就是这样的:

  • 在多个驱动器上搜索给定的文件模式(假设每个驱动器位于单独的物理设备上)
  • 对于找到的每个匹配文件,将长文件操作排队到与同一驱动器上的其他文件相同的线程 - 希望最小化随机搜索。
  • 对不同驱动器上的文件的操作应排队到不同的线程以允许并行处理。

我的问题是:我应该使用什么Rx调度程序(或调度程序的组合)?

1 个答案:

答案 0 :(得分:6)

为此,了解每个Rx可观察订阅是连续工作非常有用。也就是说,对于单个可观察的单个订阅,您可以确保一个项目的onNext委托在onNext之前完成,以便开始以下项目。

默认情况下,onNext委托在当前线程(调用OnNext()的线程)上执行,但您可以使用ObserveOn()进行更改。

这对您来说意味着您应该为每个物理驱动器创建一个单独的observable,并在一个单独的线程上观察每个物理驱动器。一种方法是,如果要执行单个可观察的操作,则使用GroupBy()

使用哪种特定的调度程序?我认为这几乎没关系。如果ObserveOn()可用,ScheduleLongRunning()似乎使用operations.GroupBy(op => op.Drive) .Select(o => o.ObserveOn(TaskPoolScheduler.Default)) .Do(o => o.Subscribe(op => op.Execute())) .Subscribe(); ,对于最常见的调度程序,它意味着它将创建一个用于观察的新线程。

将所有这些放在一起,您的代码可能类似于:

operations

(假设Drive可以观察到您的操作类型,它具有Execute()属性和{{1}}方法。)