PowerShell は 7.0 以降で、Foreach-Object で Parallel パラメーターが使用できるようになりました。
従来までは、複数スレッドで処理をする場合は、Windows PowerShell ワークフロー / ジョブ / Runspace などを使用するケースがありました。(Windows PowerShell ワークフローは 5.1 までしか使用できないので、現時点で利用することはほとんどない気もしますが)
- Windows PowerShell ワークフローの概念
- PowerShell ジョブを使用したコマンドレットの並列実行
- Beginning Use of PowerShell Runspaces: Part 1
PowerShell 7.0 以降では、Foreach-Object の Parallel パラメーターを使用することで複数スレッドの処理をシンプルに記述することができるようになっています。
$SampleText = "PowerShell Foreach-Object Parallel" Clear-Host Measure-Command { 1..50 | Foreach-Object { $text = $SampleText Write-Host ("{0} : {1}" -f $text, $_) } } Measure-Command { 1..50 | Foreach-Object -ThrottleLimit 5 -Parallel { $text = $using:SampleText Write-Host ("{0} : {1}" -f $text, $_) } }
PowerShell ForEach-Object Parallel Feature には次のように記載されています。
However, there is still quite a bit of overhead to run script blocks in parallel. Script blocks run in a context called a PowerShell
runspace
.
シンプルな処理では、スクリプトブロックを並行で実行する際のオーバーヘッドにより、Parallel を使用しない方が処理が短時間で実行されるケースもありますので、どのような処理を並行で実行するかについては注意しておく必要がありますが、1 回の実行に数秒かかる処理などは並行実行すると効果があるのではないでしょうか。
Azure Functions の PowerShell ランタイムも PowerShell のバージョンが 7.0 になっていますので、Azure 上で関数を実行する場合にも効果的に動作するケースがあるかと思います。(Azure Automation については How can we improve Azure Automation service? に記載されていますが、CY21 Q4 に、PowerSHell 7.0 をサポート予定のようです)
Foreach-Object で Parallel パラメーターを使用したした際の情報ですが、冒頭に記載したリリース時の情報だけでなく、docs のドキュメントでいくつかの情報が公開されていますので、どのような情報があるかをまとめておきたいと思います。