我有大約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