programing

파워셸에서 병렬로 태스크 실행

javamemo 2023. 11. 1. 21:55
반응형

파워셸에서 병렬로 태스크 실행

다음과 같은 PowerShell 스크립트가 있습니다.

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

이런 식으로 한 파일이 다른 파일 뒤에 처리됩니다.파일 4개를 동시에 처리하고 싶습니다.

나는 각 병렬 루프에 대해 알고 있지만, 그것은 병렬 작업을 수행합니다.기본적으로 각 루프에 대해 전체를 병렬로 실행하고 싶습니다.

PowerShell에서 이를 실현하려면 어떻게 해야 합니까?

Jobs를 조사하거나 공간을 실행할 수 있습니다.Jobs의 예는 다음과 같습니다.

$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개가 동시에 실행됨).

편집: 의견에 대한 답변으로 스크립트 블록에 대한 몇 가지 문서가 있습니다.매개 변수를 포함해야 하는 짧은 이유는 PowerShell 기능과 달리 스크립트 블록이 괄호 {} 외부의 매개 변수를 지정할 수 없기 때문입니다.

파워셸 7이 소개foreach-object -parallel:

https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature/

당신의 대본은 다음과 같이 말할 것입니다.

$files | ForEach-Object -parallel {
    [Do something]
    [Do something]
    [Do something]
}

에 의하면,ForEach -Parallel...각 항목에 대해 전체 스크립트 블록을 병렬로 처리하지만 스크립트 블록의 명령어는 순차적으로 처리됩니다(아마도 다음과 같이 괄호를 친 경우 병렬로 처리될 것입니다.Parallel {...}그러나 이를 수락하려면 스크립트가 PowerShell 워크플로우여야 합니다.Parallel그리고.Sequence키워드는 워크플로우 내에서만 유효합니다.

언급URL : https://stackoverflow.com/questions/43685522/running-tasks-parallel-in-powershell

반응형