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

시뮬레이션이 동시에 실행되도록 하려면 &시뮬레이터를 호출하는 줄 끝에 a를 추가합니다.

python sim -a $simSeed -p $launchPower &

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

예를 들어 의 경우 5개의 서로 다른 프로세스를 와 동일하게 simSeed = 1실행하고 싶습니다 . 이 부분이 완료되자마자 스크립트가 5개의 다른 병렬 프로세스에 대해 다시 실행 되기를 원합니다 .launchPower17.76 20.01 21.510 23.76simSeed = 2launchPower17.76 20.01 21.510 23.76

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

TLDR:

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

답변1

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

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

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 명령으로 전달됩니다.

관련 정보