在Windows中並行運行大量小作業,具有逾時功能

在Windows中並行運行大量小作業,具有逾時功能

我需要使用第三方 .exe 命令列應用程式處理超過 50,000 個檔案。該應用程式一次只需要一個輸入文件,因此我必須啟動該應用程式 >50,000 次。

每個文件(每個作業)通常需要大約一秒鐘。但是,有時應用程式會無限期掛起。

我編寫了一個 Windows shell 腳本,它連續運行所有作業,並每秒檢查作業是否完成。 10 秒後,它會終止該作業並繼續下一個作業。不過,大約需要20個小時。我相信如果我並行運行多個作業,我可以大大降低總運行時間。問題是如何?

在 CMD 中,我使用 Start 啟動任務,但沒有簡單的方法來恢復進程 ID (PID),因此我無法輕鬆追蹤哪個執行個體運行了多長時間。我覺得我正在嘗試重新發明雨傘。有什麼建議麼?

答案1

電源外殼是你的朋友。

https://serverfault.com/questions/626711/how-do-i-run-my-powershell-scripts-in-parallel-without-using-jobs問類似的問題。

「快速」和「穩健」當然是主觀的。

答案2

正如 Quadruplebucky 的回答所示,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
  }

一些注意事項:

  • 呼叫並行函數(又名小指令)可以下載這裡
  • 運行空間就是我所說的「實例」。-runspaceTimeout提供每個實例的最大運行時間。
  • -throttle設定同時運行實例的最大數量。

相關內容