短期間で最適化する必要があるファイルは約290個です。cmdで複数のコマンドスレッドを起動できますか?
optipng *.png
とすると、取引を完了するまでに約10分かかります。
しかし、optipng a*.png
とoptipng m*.png
を2つの別々のコマンドラインで実行すると、5分で作業が完了します。
これで、約20個のプロセスを同時に起動する方法はありますが、これは作業を高速化し、デスクトップ上のすべての領域を占めることはありませんか?
短期間で最適化する必要があるファイルは約290個です。cmdで複数のコマンドスレッドを起動できますか?
optipng *.png
とすると、取引を完了するまでに約10分かかります。
しかし、optipng a*.png
とoptipng m*.png
を2つの別々のコマンドラインで実行すると、5分で作業が完了します。
これで、約20個のプロセスを同時に起動する方法はありますが、これは作業を高速化し、デスクトップ上のすべての領域を占めることはありませんか?
バッチファイルを作成し、そのファイルからコマンドを非同期で実行できるようです。
私はしばらく前に、コマンドの唯一の最大数を実行するバッチファイルを書いた:それは、並列に実行する4つの新しいプロセスの最大を生成します
@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
:Parallel execution of shell processesを最小化されました。待ち時間は、各プロセスの処理量と実行時間に応じて調整する必要があります。おそらく、あなたが何か他のことをしている場合、タスクリストが探しているプロセス名を調整する必要もあります。
このバッチによって生成されたプロセスを適切にカウントする方法はありません。 1つの方法は、バッチ開始時に乱数を作成し(
%RANDOM%
)、処理を行う(または処理プログラムを生成する)がウィンドウタイトルをパラメータに設定できるヘルパーバッチを作成することです:@echo off title %1 "%2" "%3"
これは、タイトルを最初のパラメータに設定し、3番目の引数を指定して2番目のパラメータを実行する単純なバッチです。指定したウィンドウタイトル(
tasklist /fi "windowtitle eq ..."
)を持つプロセスだけを選択して、タスクリストをフィルタリングできます。これはかなり信頼性が高く、あまりにも多くの誤検出を防ぎます。cmd.exe
を検索すると、実行中のインスタンスがまだ残っていると悪い考えです。これはワーカープロセスのプールを制限するためです。
%NUMBER_OF_PROCESSORS%
を使用すると、いくつのインスタンスを生成するかの分かりやすいデフォルトを作成できます。
psexec
を使用すると、リモートからプロセスを起動できます(ただし、他のマシンで管理者権限を持ち、バッチでパスワードを入力する必要があります)。ただし、フィルタリングにプロセス名を使用する必要があります。
非常に良い!このトリックをありがとうございました – Benoit