Ejecución de tareas paralelas en powershell
foreach parallel-processing (2)
Tengo un script de PowerShell como este:
Foreach ($file in $files) {
[Do something]
[Do something]
[Do something]
}
De esta manera, un archivo se trata después del otro. Quiero tratar 4 archivos al mismo tiempo.
Sé del foreach -parallel loop, pero eso hace las tareas [hacer algo] en paralelo. Básicamente quiero ejecutar todo el bucle foreach en paralelo.
¿Cómo puedo lograr esto en PowerShell?
De acuerdo con
Get-Help about_Foreach-Parallel
,
ForEach -Parallel...
procesará todo el bloque de secuencia de comandos en paralelo para cada elemento, pero los comandos en el bloque de secuencia de comandos se procesarán secuencialmente (aunque presumiblemente se pondrán en paralelo si se colocan entre paréntesis con
Parallel {...}
).
Sin embargo, su script debe ser un flujo de trabajo de PowerShell para que esto sea aceptado;
las palabras clave
Parallel
y
Sequence
solo son efectivas dentro de los flujos de trabajo.
Puede buscar Jobs o runspaces . Aquí hay un ejemplo de trabajos:
$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
En el código anterior, lo tengo donde cada
$file
se ejecuta en paralelo entre sí (hasta 4 se ejecutan simultáneamente).
EDITAR: en respuesta a los comentarios, here hay algo de documentación sobre bloques de script. La razón breve sobre por qué debe incluir el parámetro es porque, a diferencia de las funciones de PowerShell, los bloques de script no pueden especificar parámetros fuera de las llaves {}.