在 Windows 中并行运行大量小型作业,具有超时功能

在 Windows 中并行运行大量小型作业,具有超时功能

我需要使用第三方 .exe 命令行应用程序处理超过 50,000 个文件。该应用程序每次只接受一个输入文件,因此我必须启动该应用程序超过 50,000 次。

每个文件(每个作业)通常需要大约一秒钟。但是,有时应用程序会无限期挂起。

我编写了一个 Windows shell 脚本,该脚本按顺序运行所有作业,并每秒检查一次作业是否完成。10 秒后,它会终止该作业并继续执行下一个作业。但是,这需要大约 20 小时。我相信如果我并行运行多个作业,我可以大大减少总运行时间。问题是如何做到?

在 CMD 中,我使用“开始”启动任务,但没有简单的方法来恢复进程 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
  }

一些说明:

  • Invoke-Parallel 函数(又名命令)可以下载这里
  • 运行空间就是我所说的“实例”。-runspaceTimeout为每个实例提供最长的运行时间。
  • -throttle设置同时运行实例的最大数量。

相关内容