Параллельное выполнение большого количества небольших заданий в Windows с возможностью тайм-аута
Мне нужно обработать>50000 файлов с помощью стороннего приложения командной строки.exe. Приложение принимает только один входной файл за раз, поэтому я должен запустить приложение>50000 раз.
Каждый файл (каждая работа) обычно занимает около одной секунды. Однако иногда приложение зависает на неопределенное время.
Я написал сценарий оболочки Windows, который запускает все задания последовательно и каждую секунду проверяет, выполнено ли задание. Через 10 секунд он убивает задание и переходит к следующему. Тем не менее, это занимает около 20 часов. Я полагаю, что смогу значительно сократить общее время выполнения, если параллельно выполню несколько заданий. Вопрос в том, как?
В CMD я запускаю задачу с помощью Start, но не существует простого способа восстановить идентификатор процесса (PID), и поэтому я не могу легко отслеживать, какой экземпляр выполнялся в течение какого времени. Я чувствую, что пытаюсь изобрести зонт заново. Какие-либо предложения?
2 ответа
Powershell - твой друг.
https://serverfault.com/questions/626711/how-do-i-run-my-powershell-scripts-in-parallel-without-using-jobs просит что-то подобное.
"Быстрый" и "надежный", конечно, субъективны.
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 (aka cmdlet) можно скачать здесь.
- Runspace - это то, что я бы назвал "экземпляром".
-runspaceTimeout
обеспечивает максимальное время работы для каждого экземпляра. -throttle
устанавливает максимальное количество одновременно работающих экземпляров.