시간 초과 기능을 사용하여 Windows에서 다수의 소규모 작업을 병렬로 실행

시간 초과 기능을 사용하여 Windows에서 다수의 소규모 작업을 병렬로 실행

타사 .exe 명령줄 응용 프로그램을 사용하여 50,000개가 넘는 파일을 처리해야 합니다. 애플리케이션은 한 번에 하나의 입력 파일만 사용하므로 애플리케이션을 50,000회 이상 실행해야 합니다.

각 파일(각 작업)은 일반적으로 약 1초 정도 걸립니다. 그러나 때로는 응용 프로그램이 무기한 중단되는 경우도 있습니다.

나는 모든 작업을 순차적으로 실행하고 작업이 완료되었는지 매초 확인하는 Windows 셸 스크립트를 작성했습니다. 10초 후에 작업이 종료되고 다음 작업으로 넘어갑니다. 그러나 약 20시간이 소요됩니다. 여러 작업을 병렬로 실행하면 전체 런타임을 크게 줄일 수 있다고 생각합니다. 문제는 어떻게?

CMD에서는 시작을 사용하여 작업을 시작하지만 프로세스 ID(PID)를 복구하는 간단한 방법이 없으므로 어떤 인스턴스가 얼마나 오랫동안 실행되었는지 쉽게 추적할 수 없습니다. 우산을 재발명하려는 것 같은 느낌이 듭니다. 어떤 제안이 있으십니까?

답변1

파워셸당신의 친구입니다.

https://serverfault.com/questions/626711/how-do-i-run-my-powershell-scripts-in-parallel-without-using-jobs비슷한 것을 묻습니다.

"빠름"과 "견고함"은 물론 주관적입니다.

답변2

Quadruplebuky의 답변에 표시된 대로 Powershell이 ​​트릭을 수행했습니다. 내가 사용한 코드는 다음과 같습니다. 마지막 두 번째 줄( ./xml2csv...)은 작업 자체입니다. 스크립트의 나머지 부분은 유사한 작업에 재사용할 수 있습니다.

# PARAMETERS
$root = 'D:\Ratings'
$folder = 'SP'

# Import Invoke-Parallel
 .".\Invoke-Parallel.ps1"

# Run in parallel
Get-ChildItem ".\$folder-xml" -Filter *.xml |
Invoke-Parallel -throttle 10 -runspaceTimeout 10 -ImportVariables `
  -ScriptBlock {
    $file = $_.BaseName
    echo $file
    cd $root
    (./xml2csv $folder-xml\$file.xml $folder-csv\$file.csv fields-$folder.txt -Q) | out-null
  }

몇 가지 참고사항:

  • Invoke-Parallel 함수(일명cmdlet) 다운로드 가능여기.
  • Runspace는 제가 "인스턴스"라고 부르는 것입니다. -runspaceTimeout각 인스턴스에 대한 최대 실행 시간을 제공합니다.
  • -throttle동시에 실행되는 최대 인스턴스 수를 설정합니다.

관련 정보