Bash 연속 및 병렬 루프/명령

Bash 연속 및 병렬 루프/명령

제가 만든 Python 도구를 사용하여 몇 가지 시뮬레이션을 실행하고 싶습니다. 문제는 다른 인수/매개변수 및 모든 항목을 사용하여 여러 번 호출해야 한다는 것입니다.

현재 다음과 같은 작업을 수행하기 위해 여러 루프를 사용하고 있습니다 for.

for simSeed in 1 2 3 4 5
do
    for launchPower in 17.76 20.01 21.510 23.76
    do
        python sim -a $simSeed -p $launchPower
    done
done

시뮬레이션을 동시에 실행하기 위해 &시뮬레이터를 호출하는 줄 끝에 를 추가했습니다.

python sim -a $simSeed -p $launchPower &

이 방법을 사용하면 이러한 토렌트를 여러 개 실행할 수 있습니다. 그러나 내 컴퓨터의 메모리가 제한되어 있으므로 위 스크립트를 다시 작성하여 내부 for루프를 병렬로 시작하고 외부 루프를 순차적으로 시작하고 싶습니다 for.

simSeed = 1예를 들어, 5개의 서로 다른 프로세스가 동일하게 실행 되기를 원합니다 . 이 부분이 완료되면 5개의 서로 다른 병렬 프로세스를 사용하여 스크립트를 다시 실행하고 싶습니다.launchPower17.76 20.01 21.510 23.76simSeed = 2launchPower17.76 20.01 21.510 23.76

이 작업을 어떻게 수행할 수 있나요?

요약:

외부 루프는 순차적으로 실행되고 내부 루프는 병렬로 실행되어 내부 루프의 마지막 병렬 프로세스가 완료되면 외부 루프가 다음 반복으로 이동하기를 원합니다.

답변1

GNU Parallel에는 작업을 병렬로 시작할 때 리소스 사용을 제한하는 몇 가지 옵션이 있습니다.

두 개의 중첩 루프의 기본 사용법은 다음과 같습니다.

parallel python sim -a {1} -p {2} ::: 1 2 3 4 5 ::: 17.76 20.01 21.510 23.76

예를 들어 최대 5개의 작업을 동시에 시작하려면 다음과 같이 말할 수 있습니다.

parallel -j5 python <etc.>

--memfree또는 사용 가능한 메모리가 충분한 경우에만(예: 최소 256MB) 새 작업을 시작하는 옵션을 사용할 수 있습니다.

parallel --memfree 256M python <etc.>

이 마지막 옵션은 메모리가 명시된 "예약" 값의 50% 미만으로 떨어지면 가장 최근에 시작된 작업을 종료합니다(그러나 따라잡기 위해 자동으로 다시 대기열에 넣습니다).

답변2

의견에서 언급했듯이 이것이 바로 GNU parallel의 목적입니다.

for simSeed in 1 2 3 4 5
do
    ## Launch 5 instances in parallel 
    parallel -j5 python sim -a $simSeed -p {} ::: 17.76 20.01 21.510 23.76
done

답변3

해당 프로세스 ID를 저장하고 wait완료되도록 할 수 있습니다.

for simSeed in {1..5}; do
  pids=()
  for launchPower in 17.76 20.01 21.510 23.76; do
    python sim -a $simSeed -p $launchPower &
    pids+=($!)
  done
  wait ${pids[@]}
done

pids내부 루프 백그라운드 작업에 대한 프로세스 ID의 배열입니다. ${pids[@]}배열의 모든 요소는 wait 명령으로 전달됩니다.

관련 정보