Параллельное выполнение задач в 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
ключевые слова эффективны только в рабочих процессах.