2011-01-29 292 views
4

我有大约290个文件需要在短时间内优化。可能在cmd中启动多个命令线程?

当我做optipng *.png大约需要10分钟完成交易。

但是,当我在两个单独的命令行中执行optipng a*.pngoptipng m*.png时,它将在5分钟内完成工作。

现在有一种方法可以同时启动约20个进程,这将使工作更快完成,而不会占用桌面上的所有空间?

回答

2

我写了执行命令的,而以前只有最大数量的批处理文件: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 

它生成最多四个新工艺的并行执​​行并最小化。等待时间可能需要调整,具体取决于每个进程的运行时间以及运行时间。如果您正在做其他事情,您可能还需要调整任务列表正在查找的进程名称。

尽管如此,没有办法正确计数由此批处理产生的进程。一种方法是建立在批次(%RANDOM%)开始一个随机数,创建一个帮助一批,做的处理(或派生的处理程序),但它可以设置其窗口标题参数:

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

这将是一个简单的批处理,它将标题设置为第一个参数,然后以第三个参数运行第二个参数。然后,您可以通过仅选择具有指定窗口标题的进程(tasklist /fi "windowtitle eq ...")来过滤任务列表。这应该工作相当可靠,并防止太多的误报。如果您仍然有一些实例正在运行,搜索cmd.exe将是一个糟糕的主意,因为这会限制您的工作进程池。

您可以使用%NUMBER_OF_PROCESSORS%创建一个合理的默认多少个实例产卵。

你也可以很容易地使用它来使用psexec来远程产生进程(但不会非常可行,因为你必须在另一台机器上拥有管理员权限并且在批处理中提供密码)。不过,您必须使用流程名称进行过滤。

+0

非常好!这个技巧非常感谢你 – Benoit 2011-02-24 08:20:52