SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Archive for 4月 20th, 2021

PowerShell の Foreach-Object の Parallel パラメーターの情報

one comment

PowerShell は 7.0 以降で、Foreach-Object で Parallel パラメーターが使用できるようになりました。

従来までは、複数スレッドで処理をする場合は、Windows PowerShell ワークフロー / ジョブ / Runspace などを使用するケースがありました。(Windows PowerShell ワークフローは 5.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 のドキュメントでいくつかの情報が公開されていますので、どのような情報があるかをまとめておきたいと思います。

Read the rest of this entry »

Written by Masayuki.Ozawa

4月 20th, 2021 at 10:48 am

Posted in PowerShell

Tagged with