PowerShellの並列処理:RunspacePoolとConcurrentDictionaryで進行状況を管理

PowerShell

はじめに

PowerShellの並列処理サンプルここでは、RunspacePoolを使用して並列処理を実現し、非ジェネリックなHashtableではなく、スレッドセーフなConcurrentDictionaryを使用する方法について解説する。

スクリプトの概要

このスクリプトは、3つのカテゴリー(車、動物、植物)の単語リストを並列で処理し、各カテゴリーの単語数をカウントするものである。以下のリンクからスクリプトの全体を確認できる: GitHub リンク

1. 同期Dictionaryの作成

まず、スレッドセーフなConcurrentDictionaryを作成する。これにより、ジョブとメインスクリプト間で情報を安全に共有できる。

  • ConcurrentDictionary: スレッドセーフな辞書型コレクション。
  • syncDict["Host"]: PowerShellホストへのアクセスを提供するためのプロパティ。

2. RunspacePoolの作成

次に、RunspacePoolを作成して開く。RunspacePoolは、複数のPowerShellインスタンスを効率的に管理するためのオブジェクトである。

  • RunspacePool: 複数のPowerShellインスタンスを効率的に管理するためのオブジェクト。
  • CreateRunspacePool(1, 2): 最小1、最大2のRunspaceを持つプールを作成。
  • Open(): RunspacePoolを開き、使用可能にする。

3. カテゴリーごとの単語リストを定義

次に、各カテゴリーごとの単語リストを定義する。

  • カテゴリーごとの単語リスト: 各カテゴリーに対応する単語リストを定義。

4. ジョブの作成と開始

エコージョブのスクリプトブロックを作成し、バックグラウンドジョブとして実行する。

  • スクリプトブロック: バックグラウンドジョブとして実行されるコード。
  • BeginInvoke(): ジョブを非同期で開始。

5. ジョブの完了を待機しながらリアルタイム出力

ジョブの完了を待ちながら、リアルタイムで出力を表示する。

  • リアルタイム出力: Verboseストリームに出力がある場合、それを読み取って表示。

6. 結果の取得と後処理

ジョブの結果を取得し、後処理を行う。

  • 結果の取得EndInvoke()メソッドでジョブの結果を取得。
  • リソースの解放Dispose()メソッドでリソースを解放。

7. RunspacePoolのクリーンアップ

最後に、RunspacePoolをクリーンアップする。

  • RunspacePoolのクリーンアップClose()およびDispose()メソッドでリソースを解放。

最終結果の表示

最後に、すべてのジョブの結果を表示する。

最終結果

コメント

タイトルとURLをコピーしました