簡體   English   中英

Powershell作業執行可正確處理批處理,而無需等待整個批處理完成

[英]Powershell job execution handle batch processing properly without waiting for whole batch to finish

我正在使用PowerShell作業並行處理活動。 我在下面附加了示例代碼。

Function Wait-UntilJobFailOrSuccess {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline)]
        [System.Management.Automation.Job[]]$Job
    )
    begin {
        $jobs = @()
        $abort = $false
    }
    process {
        $jobs += $Job
    }
    end {

        while ('Running' -In $jobs.State) {
            if ('Failed' -in $jobs.State) {
                $jobs | Stop-Job 
                $abort = $true
                break
            }
            Start-Sleep -Milliseconds 500
        }

        foreach ($job in $jobs) {
            if ($job.State -eq 'Failed') {
                $job.ChildJobs | ForEach-Object {
                    Write-Host ($_.JobStateInfo.Reason.Message) -ForegroundColor Red
                }
            }
            else {

                Write-Host "$($job.Name) $($job.State) successfully"
            }
        }

        if ($abort) {
            exit 1
        }
    }
}

以上方法將用於將並行執行的作業。

$packageSpecs | ForEach-Object -Begin {
    $job = @()
} -Process {
    $builditem = $_ 
   $job += Start-Job -Name $("Pack" + $builditem.name) -ScriptBlock $scriptoExecute -ArgumentList $args
    if ($job.Count -eq $maxNumberOfThread) {
        $job |Wait-UntilJobFailOrSuccess
        $job = @()
    }
} -End {

    if ($job.Count -gt 0) {
        $job |Wait-UntilJobFailOrSuccess
        $job = @()
    }

}

如果您看到以上代碼,則我正在根據計算機中存在的CPU數量來運行作業,$ maxNumberOfThread包含系統中允許的邏輯進程數。

現在,我將告訴您我的問題陳述。

假設$ maxNumberOfThread = 4。 它將一次處理4個作業。 我想要的是,如果我正在處理4個作業,而任何一個作業都已完成。 我應該能夠排隊下一個。 目前它正在處理所有四個工作然后下一批。

我做了一些調整,我剪掉了Wait-UntilJobFailOrSuccess函數。 但這應該可行。 嘗試讓我知道。 如果它可以正常工作,則可以針對您的功能進行調整。

 $packageSpecs | ForEach-Object -Begin {
     $job = @()
 } -Process {
     $builditem = $_ 
     $job += Start-Job -Name $("Pack" + $builditem.name) -ScriptBlock $scriptoExecute -ArgumentList $args
     $running = @($job | Where-Object { $_.State -eq 'Running' })
     if ($running.Count -ge $maxNumberOfThread) {
         $running | Wait-Job -Any | Out-Null
         Write-Verbose "Waiting on jobs" -Verbose
     }  

 } -End {

     if ($job.Count -gt 0) {
         $job |Wait-UntilJobFailOrSuccess
         $job = @()
     }
 }

我對您的功能進行了一些更改,請讓我知道它的工作原理。 現在,該函數需要將$ MaxNumberOfThread傳遞給它。

Function Wait-UntilJobFailOrSuccess {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline)]
        [System.Management.Automation.Job[]]$Job,

        [Parameter()]
        [int]$maxNumberOfThread
    )
    begin {
        $jobs = @()
        $abort = $false
    }
    process {
        $jobs += $Job
        foreach ($j in $Jobs) {
            $running = @($jobs | Where-Object { $_.State -eq 'Running' })
            if ($running.Count -ge $maxNumberOfThread) {
                if ('Failed' -in $jobs.State) {
                    $jobs | Stop-Job 
                    $abort = $true
                    break
                }
                else {
                    $running | Wait-Job -Any | Out-Null
                    Write-Verbose "Waiting on jobs" -Verbose
                }
            }
            if ($abort) {
                exit 1
            }
        }
    }
    end {
        foreach ($j in $jobs) {
            if ($j.State -eq 'Failed') {
                $j.ChildJobs | ForEach-Object {
                    Write-Host ($_.JobStateInfo.Reason.Message) -ForegroundColor Red
                }
            }
            else {

                Write-Host "$($j.Name) $($j.State) successfully"
            }
        }       
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM