Я написав пакетний файл, який виконує лише максимальну кількість команд деякий час тому на Stack Overflow: Паралельне виконання оболонок :
@echo off
for /l %%i in (1,1,20) do call :loop %%i
goto :eof
:loop
call :checkinstances
if %INSTANCES% LSS 5 (
rem just a dummy program that waits instead of doing useful stuff
rem but suffices for now
echo Starting processing instance for %1
start /min wait.exe 5 sec
goto :eof
)
rem wait a second, can be adjusted with -w (-n 2 because the first ping returns immediately;
rem otherwise just use an address that's unused and -n 1)
echo Waiting for instances to close ...
ping -n 2 ::1 >nul 2>&1
rem jump back to see whether we can spawn a new process now
goto loop
goto :eof
:checkinstances
rem this could probably be done better. But INSTANCES should contain the number of running instances afterwards.
for /f "usebackq" %%t in (`tasklist /fo csv /fi "imagename eq wait.exe"^|find /v /c ""`) do set INSTANCES=%%t
goto :eof
Він породжує максимум чотири нові процеси, які виконуються паралельно і мінімізуються. Час очікування потрібно скоригувати, ймовірно, залежно від того, скільки працює кожен процес і як довго він працює. Можливо, вам також потрібно буде скоригувати ім'я процесу, для якого шукається список завдань, якщо ви робите щось інше.
Однак немає можливості правильно підрахувати процеси, породжені цією партією. Одним із способів було б створити випадкове число на початку партії ( %RANDOM%
) та створити помічну партію, яка виконує обробку (або породить програму обробки), але яка може встановити її заголовок вікна параметром:
@echo off
title %1
"%2" "%3"
Це був би простий пакет, який встановлює свій заголовок першому параметру, а потім запускає другий параметр з третім як аргумент. Потім можна фільтрувати у списку завдань, вибравши лише процеси з вказаним заголовком вікна ( tasklist /fi "windowtitle eq ..."
). Це повинно працювати досить надійно і запобігати занадто багато хибних позитивних результатів. Пошук cmd.exe
буде поганою ідеєю, якщо у вас все ще запущені деякі екземпляри, оскільки це обмежує ваш набір робочих процесів.
Ви можете використовувати %NUMBER_OF_PROCESSORS%
для створення розумного за замовчуванням кількість екземплярів, які потрібно нерестувати.
Ви також можете легко адаптувати це до використання psexec
для віддаленого нерестування процесів (але це не буде дуже життєздатним, оскільки вам доведеться мати права адміністратора на іншій машині, а також вводити пароль у пакеті). Тоді вам доведеться використовувати назви процесів для фільтрації.