2011-01-29 13 views
4

J'ai environ 290 fichiers que j'ai besoin d'optimiser dans un court laps de temps.Possibilité de lancer plusieurs threads de commandes en cmd?

Lorsque je fais optipng *.png il faut environ 10 minutes pour terminer la transaction.

Cependant quand je fais optipng a*.png et optipng m*.png dans deux ligne de commande séparée il fait le travail en 5 minutes.

Maintenant, y a-t-il un moyen de lancer 20 processus en même temps, ce qui accélérera le travail et ne prendra pas tout l'espace sur mon bureau?

Répondre

2

J'ai écrit un fichier de commandes qui exécute un nombre maximum de commandes il y a un moment: Parallel execution of shell processes:

@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 

Il génère un maximum de quatre nouveaux processus qui exécutent en parallèle et minimisé. Le temps d'attente doit être ajusté probablement, en fonction de la durée de chaque processus et de sa durée. Vous devrez probablement également ajuster le nom du processus pour lequel la liste des tâches recherche si vous faites autre chose.

Toutefois, il n'existe aucun moyen de comptabiliser correctement les processus générés par ce lot. Une façon serait de créer un nombre aléatoire au début du lot (%RANDOM%) et créer un lot d'aide qui fait le traitement (ou engendre le programme de traitement), mais qui peut définir son titre de la fenêtre à un paramètre:

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

Il s'agit d'un simple lot qui définit son titre sur le premier paramètre, puis exécute le second paramètre avec le troisième comme argument. Vous pouvez ensuite filtrer dans la liste des tâches en sélectionnant uniquement les processus avec le titre de la fenêtre spécifiée (tasklist /fi "windowtitle eq ..."). Cela devrait fonctionner assez fiable et empêcher trop de faux positifs. La recherche de cmd.exe serait une mauvaise idée si vous avez encore des instances en cours d'exécution, car cela limite votre pool de processus de travail.

Vous pouvez utiliser %NUMBER_OF_PROCESSORS% pour créer une valeur par défaut raisonnable du nombre d'instances à générer. Vous pouvez également facilement adapter cela pour utiliser psexec pour engendrer les processus à distance (mais ce ne serait pas très viable car vous devez avoir des privilèges d'administrateur sur l'autre machine et fournir le mot de passe dans le lot). Vous devrez utiliser des noms de processus pour le filtrage, cependant.

+0

Très bien! Merci beaucoup pour cette astuce – Benoit

Questions connexes