powershell foreach parallel-processing task

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 {}.