태그 보관물: automation

automation

다중 스레드 Windows FOR 배치 명령 있습니까? 4 개의

여러 스레드에서 배치 파일로 FOR 명령 을 실행하는 간단한 방법이 있는지 알고 있습니까? 4 개의 병렬 스레드에서 작업을 실행할 수없는 경우 4 개의 코어를 갖는 요점은 무엇입니까?

예를 들어 PNGOUT을 사용하여 PNG를 최적화하는 경우 사용하는 명령은 다음과 같습니다.

for %i in (*.png) do pngout "%i"

그러나 이것은 하위 작업이 서로 의존하지 않는 병렬화가 가능한 작업입니다.

이것을 4 ‘queues’에서 실행하려면 다음과 같이 씁니다.

for -thread 4 %i in (*.png) do pngout "%i"

이 작업을 수행 할 수있는 무료 응용 프로그램을 작성해야합니까, 아니면 무료 솔루션이 있습니까?



답변

나는 스택 오버플로 : 쉘 프로세스의 병렬 실행 에서 한동안 최대 수의 명령 만 실행하는 배치 파일을 작성했습니다 .

@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"^|find /v /c ""`) do set INSTANCES=%%t
goto :eof

동시에 실행되고 최소화되는 최대 4 개의 새로운 프로세스를 생성합니다. 각 프로세스의 양과 실행 시간에 따라 대기 시간을 조정해야합니다. 다른 작업을 수행하는 경우 작업 목록을 찾고있는 프로세스 이름을 조정해야 할 수도 있습니다.

그러나이 배치에서 생성 된 프로세스를 올바르게 계산할 수있는 방법이 없습니다. 한 가지 방법은 일괄 처리 시작시 임의의 숫자를 만들고 ( %RANDOM%) 처리를 수행하지만 처리 프로그램을 생성하지만 창 제목을 매개 변수로 설정할 수있는 도우미 일괄 처리를 만드는 것입니다.

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

제목을 첫 번째 매개 변수로 설정하고 두 번째 매개 변수를 인수로 사용하여 두 번째 매개 변수를 실행하는 간단한 배치입니다. 그런 다음 지정된 창 제목 ( tasklist /fi "windowtitle eq ...") 이있는 프로세스 만 선택하여 작업 목록을 필터링 할 수 있습니다 . 이것은 상당히 안정적으로 작동하고 너무 많은 오탐을 방지합니다. cmd.exe작업자 프로세스 풀을 제한하기 때문에 일부 인스턴스가 계속 실행중인 경우 검색 하는 것은 좋지 않습니다.

%NUMBER_OF_PROCESSORS%스폰 할 인스턴스 수의 합리적인 기본값을 만드는 데 사용할 수 있습니다 .

psexec프로세스를 원격으로 생성하는 데 사용 하도록 쉽게 조정할 수도 있습니다 (그러나 다른 컴퓨터에 대한 관리자 권한이 있어야하고 배치에 암호를 제공해야하므로 실용적이지는 않습니다). 그러나 필터링을 위해 프로세스 이름을 사용해야합니다.


답변

배치 파일은 매우 기본적인 스크립팅을위한 것이며 어떤 종류의 멀티 스레딩도 지원하지 않습니다. 달성하고자하는 일을하려면 자신의 유틸리티를 작성해야합니다.

또는 Windows PowerShell 이 목표에 더 가까이 다가 갈 수 있도록 더 많은 기능을 제공 할 수 있습니다.

단순히 여러 작업을 동시에 실행하려는 경우 start 명령 을 사용하여 PNGOUT 유틸리티를 새 창에서 시작할 수 있습니다 . 그런 다음 FOR 루프는 각 작업이 완료되기를 기다리지 않고 계속 진행됩니다.

수정 된 줄은 다음과 같습니다.

for %i in (*.png) do start pngout "%i"

그러나 이렇게하면 동시에 디렉토리의 모든 파일에 대해 PNGOUT이 효과적으로 시작되므로 바람직하지 않습니다.


답변