제가 만든 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개의 다른 병렬 프로세스에 대해 다시 실행 되기를 원합니다 .launchPower
17.76 20.01 21.510 23.76
simSeed = 2
launchPower
17.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 명령으로 전달됩니다.