我有大约290个文件需要在短时间内优化。可能在cmd中启动多个命令线程?
当我做optipng *.png
大约需要10分钟完成交易。
但是,当我在两个单独的命令行中执行optipng a*.png
和optipng m*.png
时,它将在5分钟内完成工作。
现在有一种方法可以同时启动约20个进程,这将使工作更快完成,而不会占用桌面上的所有空间?
我有大约290个文件需要在短时间内优化。可能在cmd中启动多个命令线程?
当我做optipng *.png
大约需要10分钟完成交易。
但是,当我在两个单独的命令行中执行optipng a*.png
和optipng m*.png
时,它将在5分钟内完成工作。
现在有一种方法可以同时启动约20个进程,这将使工作更快完成,而不会占用桌面上的所有空间?
看起来你可以写一个批处理文件,并从该文件异步运行你的命令。
我写了执行命令的,而以前只有最大数量的批处理文件: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
来远程产生进程(但不会非常可行,因为你必须在另一台机器上拥有管理员权限并且在批处理中提供密码)。不过,您必须使用流程名称进行过滤。
非常好!这个技巧非常感谢你 – Benoit 2011-02-24 08:20:52