可以在cmd中启动多个命令线程吗?

时间:2011-01-29 14:23:01

标签: windows cmd multiprocessing

我需要在短时间内优化大约290个文件。

当我执行optipng *.png时,完成交易大约需要10分钟。

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

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

2 个答案:

答案 0 :(得分: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%)并创建一个辅助批处理,用于处理(或生成处理程序),但可以将其窗口标题设置为参数:< / p>

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

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

     

您可以使用%NUMBER_OF_PROCESSORS%创建一个合理的默认值来生成多少个实例。

     

您也可以轻松地将其调整为使用psexec远程生成进程(但由于您必须在其他计算机上拥有管理员权限以及在批处理中提供密码,因此不太可行) 。但是,您必须使用进程名称进行过滤。

答案 1 :(得分:0)

看起来您可以编写批处理文件并从该文件异步运行命令。

Running Windows batch file commands asynchronously