Windows Dev. Site

Multithreading PowerShell

PowserShellを使ったマルチスレッドをテストしてみました。
1秒から10秒までスリープするスレッド10個を同時に走らせています。
AddScript, AddArgmentによるパラメータ渡し、結果取得をイメージするため、2乗する演算をいれています。(手抜き感・・)
ソースは下記サイトにあるものを簡略化しました。

環境 : PSVersion 2.0 / Windows 7


$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)
}

multiPS
結果が1行/1秒ごとに表示されるので、同時に走っていることが確認できます。
$threads数を絞ると、表示終了までにさらに時間がかかることも確認できます。

参考サイト : http://thesurlyadmin.com/2013/02/11/multithreading-powershell-scripts/