[FAQ CENTER トップ]
[Powershell FAQ トップへ]



【Powershell】Foreach -parallel による並列ジョブ実行のPowershellサンプル



更新日:2019/06/11


Foreach -parallel による並列ジョブ


Foreach -parallel による並列ジョブ実行に関して調査したためメモを残します。

・マルチスレッド処理のサンプル。(厳密にはマルチスレッドではない)
・通常のコードでは処理は順番に行われるため、場合によっては処理性能に問題がある。並列化したいところは並列で実施したい。
・そんな場合にForeach -parallelという機能が用意されている。
・workflowはスコープが特殊である。通常のスコープは使用できない。
・"-throttlelimit"で同時実行を 3 個に限定することができる。
・ $workflow:<変数名>で親スコープの変数を参照することが可能。InlineScript からは #Using もあり。
・本体と workflow 内で変数を共有することはできなかった(方法があるかも) workflowのパラメータとして渡す。


workflow hoge
{
param($p1)
}

hoge 123




・正確には複数スレッドから変数を処理する場合には排他制御が必要かもしれない。よってこのコードには欠陥があるかもしれない。
・workflow内では配列変数は使用できない。


参考:"PowerShell Workflows: Restrictions"
https://devblogs.microsoft.com/scripting/powershell-workflows-restrictions/

・c:\scripts\success-or-fail.ps1 というシェルを並列して実行している。
・"invoke-command" で powershell プロセスを複数起動する方式もあるが、処理が重たかった。

====================本体の ps1 ===========================


Workflow myloops
{
$running=0
$launched=0
$failed=0

Foreach -parallel -throttlelimit 3 ($i in 1..500)
{
$workflow:running +=1
$Iret = InlineScript
{

c:\scripts\success-or-fail.ps1
}

$workflow:running -=1
if($Iret)
{
#write-output "Success"
$workflow:launched+=1
}
else
{
#write-output "Failed"
$workflow:failed+=1
}
write-output ("running:" +$running)
write-output ("failed:" +$failed)
write-output ("launched:" +$launched)

}

}
myloops



==================== success-or-fail.ps1 ===========================

$r = Get-Random -Minimum 0 -Maximum 5

if ($r -eq 1)
{
return $False
}
else
{
return $True
}








[Powershell FAQ トップへ]
[FAQ CENTER トップ]


本サイト内掲載されている情報は、著作権法により保護されています。いかなる場合でも権利者の許可なくコピー、配布することはできません。 このページはリンクフリーです。(このページへの直接リンクも可能です。) Copyright(c) tooljp.com 2007-2018