Параллельное выполнение задач в powershell

У меня есть такой скрипт PowerShell:

Foreach ($file in $files) {
    [Do something]
    [Do something]
    [Do something]
}

таким образом один файл обрабатывается за другим. Я хочу обработать 4 файла одновременно.

Я знаю о цикле foreach-parallel, но это делает задачи [делать что-то] параллельно. Я в основном хочу запустить весь цикл foreach параллельно.

Как я могу достичь этого в PowerShell?

2 ответов


Вы можете посмотреть в рабочих мест или пространства выполнения. Вот пример заданий:

$block = {
    Param([string] $file)
    "[Do something]"
}
#Remove all jobs
Get-Job | Remove-Job
$MaxThreads = 4
#Start the jobs. Max 4 jobs running simultaneously.
foreach($file in $files){
    While ($(Get-Job -state running).count -ge $MaxThreads){
        Start-Sleep -Milliseconds 3
    }
    Start-Job -Scriptblock $Block -ArgumentList $file
}
#Wait for all jobs to finish.
While ($(Get-Job -State Running).count -gt 0){
    start-sleep 1
}
#Get information from each job.
foreach($job in Get-Job){
    $info= Receive-Job -Id ($job.Id)
}
#Remove all jobs created.
Get-Job | Remove-Job

в приведенном выше коде у меня есть это, где каждый $file выполняется параллельно друг с другом (до 4 одновременно).

EDIT: в ответ на комментарии,здесь это некоторая документация о scriptblocks. Краткая причина, по которой необходимо включить параметр, заключается в том, что в отличие от функций PowerShell, scriptblocks не может указать параметры вне фигурных скобок {}.


по данным Get-Help about_Foreach-Parallel, ForEach -Parallel... будет обрабатывать весь scriptblock параллельно для каждого элемента, но команды в scriptblock будут обрабатываться последовательно (хотя, предположительно, они будут распараллелены, если заключены в квадратные скобки с Parallel {...}). Однако ваш сценарий должен быть рабочим процессом PowerShell, чтобы это было принято;Parallel и Sequence ключевые слова эффективны только в рабочих процессах.