2

Rx 拡張機能を使用して、ファイルにバインドされた長い操作の並列化を処理したいと考えています。

ワークフローは次のようなものです。

  • 複数のドライブで特定のファイル パターンを検索します (各ドライブが別々の物理デバイス上にあると仮定します)
  • 見つかった一致するファイルごとに、長いファイル操作を同じドライブ上の他のファイルと同じスレッドにキューに入れます- できればランダムシークを最小限に抑えます。
  • 異なるドライブ上のファイルに対する操作は、並列処理を可能にするために異なるスレッドのキューに入れる必要があります。

私の質問は次のとおりです。どの Rx スケジューラ (またはスケジューラの組み合わせ) を使用する必要がありますか?

4

1 に答える 1

6

このために、各 Rx オブザーバブル サブスクリプションが連続して機能することを認識することは非常に役立ちます。つまり、1 つのオブザーバブルの 1 つのサブスクリプションの場合、onNext1 つのアイテムのデリゲートがonNext次のアイテムの開始前に完了することを確認できます。

デフォルトでは、onNextデリゲートは現在のスレッド ( を呼び出すスレッド) で実行されOnNext()ますが、 を使用して変更できますObserveOn()

これが意味することは、物理ドライブごとに個別のオブザーバブルを作成し、それぞれを個別のスレッドで観察する必要があるということです。これを行う 1 つの方法は、実行する操作の観測可能要素が 1 つある場合、 を使用することGroupBy()です。

どの特定のスケジューラーを使用しますか? ほとんど関係ないと思います。ObserveOn()利用可能な場合に使用するScheduleLongRunning()ようです。これは、最も一般的なスケジューラーにとって、監視用の新しいスレッドを作成することを意味します。

これらをすべてまとめると、コードは次のようになります。

operations.GroupBy(op => op.Drive)
          .Select(o => o.ObserveOn(TaskPoolScheduler.Default))
          .Do(o => o.Subscribe(op => op.Execute()))
          .Subscribe();

(プロパティとメソッドoperationsを持つ操作タイプが観察可能であると仮定します。)DriveExecute()

于 2013-04-05T00:51:07.530 に答える