다중 스레드 Windows FOR 배치 명령


10

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

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

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

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

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

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

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


[: 외부 도구를 사용하여 folowing 않음을 확인 stackoverflow.com/a/12041213/365229][1] [1] stackoverflow.com/a/12041213/365229
Behrouz.M

답변:


12

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

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


이것은 심각한 검은 배치 마법입니다! 나는 더 많은 투표를 할 수 있으면 좋겠다.
Axarydax

Nah, 일단 당신이 그것의 걸림 새를 얻는 일단 그것은 상당히 기본적인 물건이다 ;-)
Joey

Win10 명령 줄에서 'wc'명령을 사용할 수 없습니다. 다른 것을 사용할 수 있습니까?
PeterCo

1
@PeterCo : find /c /v "".
Joey

1

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

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

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

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

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

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


이것은 순진한 접근법이며 언급했듯이 아마 바람직하지 않습니다. 코어 수만큼 프로세스 만 실행하려고합니다. 코어 4 개와 파일 1,000 개가있는 경우 1,000 개가 모두 처리 될 때까지 한 번에 4 개만 처리하려고합니다. 4 개의 코어에서 한 번에 1,000 개를 모두 처리하려고하면 컴퓨터가 쓸모없는 크롤링 속도가 느려집니다.
Adisak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.