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

316
Mattia Landoni

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

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

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

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

1
Вопросы, связанные с рекомендациями по продуктам, услугам или учебным материалам, не имеют отношения к теме, поскольку они быстро устаревают и привлекают основанные на мнении ответы. Вместо этого опишите вашу ситуацию и конкретную проблему, которую вы пытаетесь решить. Поделитесь своими исследованиями. Xavierjazz 7 лет назад 0
Я подробно описал свою проблему в заголовке поста и первых двух абзацах. Третий абзац говорит о том, что я сделал. Я изменил четвертый абзац, но я не знаю, что вопрос сейчас лучше. Mattia Landoni 7 лет назад 0

2 ответа на вопрос

2
Mattia Landoni

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 устанавливает максимальное количество одновременно работающих экземпляров.
0
quadruplebucky

Powershell - твой друг.

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

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

Спасибо, Powershell - это то, что мне было нужно. Ниже я добавлю ответ с точным кодом, который я использовал, и я думаю, что его можно использовать повторно. Я использовал инструмент «Invoke-Parallel», упомянутый в ответе, на который вы указали. Mattia Landoni 7 лет назад 1
Я также удалил «быстрый» и «надежный» из названия. Спасибо Mattia Landoni 7 лет назад 0