我想使用我製作的 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
循環。
例如,對於,我希望 5 個不同的進程以等於 的方式simSeed = 1
運行。一旦這部分完成,我希望腳本再次運行 5 個不同的並行進程,其等於.launchPower
17.76 20.01 21.510 23.76
simSeed = 2
launchPower
17.76 20.01 21.510 23.76
我怎樣才能完成這個任務?
總而言之:
我希望外循環順序運行,內循環並行運行,這樣當內循環的最後一個並行進程完成時,外循環移動到下一個迭代。
答案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
選項僅在有足夠的可用記憶體(例如至少 256 MB)時啟動新作業
parallel --memfree 256M python <etc.>
請注意,如果記憶體低於規定的「保留」值的 50%,則最後一個選項將終止最近啟動的作業(但它將自動重新排隊以進行追趕)。
答案2
正如評論中提到的,這正是 GNUparallel
的用途:
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 命令。