[英]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.