Можно ли запустить несколько потоков команд в CMD? - PullRequest
5 голосов
/ 29 января 2011

У меня есть около 290 файлов, которые нужно оптимизировать за короткий промежуток времени.

Когда я выполняю optipng *.png, для завершения транзакции требуется около 10 минут.

Однако когдаЯ делаю optipng a*.png и optipng m*.png в двух отдельных командных строках, и работа выполняется за 5 минут.

Теперь есть способ запустить одновременно около 20 процессов, которые выполнят работубыстрее и не занимать все место на рабочем столе?

Ответы [ 2 ]

2 голосов
/ 30 января 2011

Я написал командный файл, который некоторое время назад выполнял только максимальное количество команд: Параллельное выполнение процессов оболочки :

@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"^|wc -l`) do set INSTANCES=%%t
goto :eof

Он порождает максимум четыре новых процесса, которые выполняются параллельно и свернуты. Время ожидания должно быть скорректировано, вероятно, в зависимости от того, сколько работает каждый процесс и как долго он выполняется. Вам, вероятно, также нужно настроить имя процесса, для которого ищется список задач, если вы делаете что-то еще.

Однако невозможно правильно подсчитать процессы, порожденные этим пакетом. Одним из способов может быть создание случайного числа в начале пакета (%RANDOM%) и создание вспомогательного пакета, который выполняет обработку (или порождает программу обработки), но который может установить в своем заголовке окна параметр:

@echo off
title %1
"%2" "%3"

Это будет простой пакет, который устанавливает свой заголовок на первый параметр, а затем запускает второй параметр с третьим в качестве аргумента. Затем вы можете отфильтровать список задач, выбрав только процессы с указанным заголовком окна (tasklist /fi "windowtitle eq ..."). Это должно работать достаточно надежно и предотвращать слишком много ложных срабатываний. Поиск cmd.exe был бы плохой идеей, если у вас все еще есть запущенные экземпляры, так как это ограничивает ваш пул рабочих процессов.

Вы можете использовать %NUMBER_OF_PROCESSORS%, чтобы создать разумное значение по умолчанию для количества экземпляров, которые должны появиться.

Вы также можете легко адаптировать это для использования psexec для удаленного запуска процессов (но это не очень жизнеспособно, так как вам нужно иметь права администратора на другом компьютере, а также указать пароль в пакете). Тогда вам придется использовать имена процессов для фильтрации.

0 голосов
/ 29 января 2011

Похоже, что вы можете написать пакетный файл и асинхронно запускать свои команды из этого файла.

Асинхронный запуск команд пакетного файла Windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...