파워셸에서 병렬로 태스크 실행
다음과 같은 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
'programing' 카테고리의 다른 글
translatable="false"가 있는 strings.xml의 "여기서 번역되지만 기본 로케일에서는 찾을 수 없습니다" 오류 (0) | 2023.11.01 |
---|---|
memset과 루프가 복수의 배열을 영점화하는 것 중 어느 것이 더 빠르거나 더 좋습니까? (0) | 2023.11.01 |
Ora-01427 단일 행 하위 쿼리가 두 개 이상의 행을 선택하여 반환하도록 수정하는 방법은 무엇입니까? (0) | 2023.10.27 |
PowerShell에서 Byte[] 만들기 (0) | 2023.10.27 |
AngularJS - Get 및 Post에 대한 $resource different URL (0) | 2023.10.27 |