제가 만든 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개의 서로 다른 병렬 프로세스를 사용하여 스크립트를 다시 실행하고 싶습니다.launchPower
17.76 20.01 21.510 23.76
simSeed = 2
launchPower
17.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 명령으로 전달됩니다.