单处理器系统上的多线程PowerShell脚本

时间:2014-05-01 21:40:49

标签: multithreading batch-file powershell

我可以访问单核单处理器虚拟机,用于为我的团队进行日志记录。我有以下代码:

$sb = {
Param($_)

if($_.CONTROLLER -ne ".xx" ){
    $posIP = "10." + $_.IP + $_.CONTROLLER 
    if (Test-Connection -ComputerName $posIP -Count 1 -Quiet) {
        $mapPath = "\\" + $posIP + "\c$"
        net use $mapPath $password /user:$userName | Out-Null
        if(Test-Path $mapPath$dataFile) {
            [xml]$periods = Get-Content $mapPath$dataFile
            $endDate = $periods.IndataDbf.ingredient.PeriodDetail.PeriodEndDate | select -last 1
            $output = "$($_.STORE);$endDate" }
        else {
            $outPut = $_.STORE + ';' + "$dataFile Not Found" }
        net use $mapPath /de | Out-Null
    }
    else {
        $outPut = $_.STORE + ';' + "Map FAILED" }
    Write-Output $OutPut
}
}

Import-Csv $inFile | ForEach-Object { 
while ((Get-Job -State Running).Count -ge 100) {
   Start-Sleep -Seconds 5;
}
Write-Output $_.STORE
Start-Job -Scriptblock $sb -ArgumentList $_ | Write-Verbose
Get-Job -State Completed -HasMoreData 1 | Receive-Job | Out-File -Append -FilePath $outLog
}
Get-Job | Wait-Job | Receive-Job | Out-File -Append -FilePath $outLog

哪个运行良好,但运行相同代码的时间与Start-Job相同,只需一个循环。但是,之前的日志记录命令使用BATCH文件并自动打开了几十个子命令窗口来处理数据,然后返回,并且它在不到一半的时间内运行。使用的代码是相同的,所以我不明白为什么添加更多的线程不会使脚本运行得更快。任何人都可以告诉我为什么一个带有几十个子窗口的BATCH文件程序运行得如此之快,可以说是相同的代码?为什么Start-Job命令根本没有提高速度?我认为它会尝试同时执行多个线程。

1 个答案:

答案 0 :(得分:0)

因为使用start-job和使用管道时会有很多开销。 如果你使用运行空间而不是它可能更快。看看http://newsqlblog.com/2012/05/22/concurrency-in-powershell-multi-threading-with-runspaces/