知識マップ: PowerShellの並列処理 ── ForEach-Object -Parallelとジョブの使い分け
記事「PowerShellの並列処理 ── ForEach-Object -Parallelとジョブの使い分け」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
PowerShellの並列処理はランスペースという実行環境を複数用意して行われ、ForEach-Object -Parallelは各要素を別ランスペースのスレッドで実行し、呼び出し元の変数は$using:で参照として渡す。書き込みを伴う共有には通常のハッシュテーブルではなくConcurrentDictionaryなどスレッドセーフな型が前提になり、呼び出し元で定義した関数を使うには.psm1モジュール化して各ランスペースで読み込む必要がある。同時実行数はThrottleLimitで制御し、待ち時間が支配的な処理には効果がある一方、1件あたりが軽い処理や少件数の処理には向かずMeasure-Commandでの比較が推奨される。プロセス隔離が必要ならStart-Job、軽量な投げっぱなし処理ならStart-ThreadJobが向き、相手が業務サーバーの場合はThrottleLimitを上げすぎると相手側に過負荷をかけることもある。
flowchart LR
accTitle: PowerShellの並列処理の知識マップ
accDescr: ForEach-Object -Parallelがランスペースとusingスコープ修飾子の仕組みの上に成り立ち、ThrottleLimitでの制御やスレッドセーフなコレクション・.psm1モジュール化が必要になる場面、Start-ThreadJob・Start-Job・Invoke-Commandとの使い分け、並列化が効く場面と効かない場面の関係を示す図
foreach_object_parallel["ForEach-Object -Parallel"]
runspace["ランスペース(runspace)"]
using_scope_modifier["$using:スコープ修飾子"]
throttle_limit["ThrottleLimit"]
concurrent_collection["スレッドセーフなコレクション型"]
psm1_module[".psm1スクリプトモジュール"]
start_threadjob["Start-ThreadJob"]
start_job["Start-Job"]
invoke_command_remote["Invoke-Command -ComputerName"]
trivial_per_item_workload["1件あたりが軽い・少件数のワークロード"]
io_wait_bound_workload["待ち時間が支配的な処理"]
measure_command["Measure-Command"]
process_isolation_required["プロセス隔離が必要な処理"]
downstream_server_overload["接続先サーバーへの過負荷"]
foreach_object_parallel -->|"利用する"| runspace
foreach_object_parallel -.->|"利用する"| using_scope_modifier
foreach_object_parallel -->|"で構成できる"| throttle_limit
using_scope_modifier -.->|"前提とする"| concurrent_collection
foreach_object_parallel -.->|"前提とする"| psm1_module
start_threadjob -->|"利用する"| runspace
start_job -.->|"前提とする"| psm1_module
start_threadjob -.->|"前提とする"| psm1_module
invoke_command_remote -->|"で構成できる"| throttle_limit
foreach_object_parallel -->|"用いるのは非推奨"| trivial_per_item_workload
foreach_object_parallel -->|"推奨される対応"| io_wait_bound_workload
foreach_object_parallel -->|"で確認できる"| measure_command
start_job -->|"推奨される対応"| process_isolation_required
start_threadjob -->|"用いるのは非推奨"| process_isolation_required
throttle_limit -.->|"原因になり得る"| downstream_server_overload
invoke_command_remote -.->|"原因になり得る"| downstream_server_overload
概念間の関係(全16件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- ForEach-Object -Parallelはランスペース(runspace)を利用します。
- ForEach-Object -Parallelは$using:スコープ修飾子を利用します。
- ForEach-Object -ParallelはThrottleLimitで構成できます。
- $using:スコープ修飾子はスレッドセーフなコレクション型を前提とします。
- ForEach-Object -Parallelは.psm1スクリプトモジュールを前提とします。
- Start-ThreadJobはランスペース(runspace)を利用します。
- Start-Jobは.psm1スクリプトモジュールを前提とします。
- Start-ThreadJobは.psm1スクリプトモジュールを前提とします。
- Invoke-Command -ComputerNameはThrottleLimitで構成できます。
- ForEach-Object -Parallelを1件あたりが軽い・少件数のワークロードに用いることは推奨されません。
- ForEach-Object -Parallelは待ち時間が支配的な処理に対する本記事の推奨です。
- ForEach-Object -ParallelはMeasure-Commandで確認できます。
- Start-Jobはプロセス隔離が必要な処理に対する本記事の推奨です。
- Start-ThreadJobをプロセス隔離が必要な処理に用いることは推奨されません。
- ThrottleLimitは接続先サーバーへの過負荷の原因になることがあります。
- Invoke-Command -ComputerNameは接続先サーバーへの過負荷の原因になることがあります。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。