Параллельный запуск большого количества небольших заданий в Windows с возможностью тайм-аута

Параллельный запуск большого количества небольших заданий в Windows с возможностью тайм-аута

Мне нужно обработать >50 000 файлов с помощью стороннего .exe-приложения командной строки. Приложение принимает только один входной файл за раз, поэтому мне приходится запускать приложение >50 000 раз.

Обычно каждый файл (каждое задание) занимает около одной секунды. Однако иногда приложение зависает на неопределенный срок.

Я написал скрипт оболочки Windows, который последовательно запускает все задания и каждую секунду проверяет, выполнено ли задание. Через 10 секунд он убивает задание и переходит к следующему. Однако это занимает около 20 часов. Я считаю, что могу значительно сократить общее время выполнения, если запущу несколько заданий параллельно. Вопрос в том, как?

В CMD я запускаю задачу с помощью Start, но нет простого способа восстановить идентификатор процесса (PID), и поэтому я не могу легко отслеживать, какой экземпляр работал как долго. У меня такое чувство, что я пытаюсь заново изобрести зонтик. Есть предложения?

решение1

Powershellтвой друг.

https://serverfault.com/questions/626711/how-do-i-run-my-powershell-scripts-in-parallel-without-using-jobsспрашивает что-то подобное.

«Быстрый» и «надежный» — понятия, конечно, субъективные.

решение2

Powershell справился с задачей, как указано в ответе quadruplebucky. Вот код, который я использовал. Вторая с конца строка ( ./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устанавливает максимальное количество одновременно запущенных экземпляров.

Связанный контент