Multithreading PowerShell
PowserShellを使ったマルチスレッドをテストしてみました。
1秒から10秒までスリープするスレッド10個を同時に走らせています。
AddScript, AddArgmentによるパラメータ渡し、結果取得をイメージするため、2乗する演算をいれています。(手抜き感・・)
ソースは下記サイトにあるものを簡略化しました。
環境 : PSVersion 2.0 / Windows 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | $threads = 10 $scriptBlock = { Param ( [ int ]$num ) Start - Sleep - Seconds $num $res = New - Object PSObject - Property @{num = $num;num2 = $num * $num} Return $res } $runspacePool = [RunspaceFactory]::CreateRunspacePool( 1 , $threads) $runspacePool. Open () $jobs = @() 1. . 10 | % { $job = 1 ::Create().AddScript($scriptBlock).AddArgument($_) $job.runspacePool = $runspacePool $jobs + = New - Object PSObject - Property @{ num = $_ pipe = $job result = $job.BeginInvoke() } } ForEach ($job in $jobs) { $job.pipe.EndInvoke($job.result) } |
結果が1行/1秒ごとに表示されるので、同時に走っていることが確認できます。
$threads数を絞ると、表示終了までにさらに時間がかかることも確認できます。
参考サイト : http://thesurlyadmin.com/2013/02/11/multithreading-powershell-scripts/