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循環。

例如,對於,我希望 5 個不同的進程以等於 的方式simSeed = 1運行。一旦這部分完成,我希望腳本再次運行 5 個不同的並行進程,其等於.launchPower17.76 20.01 21.510 23.76simSeed = 2launchPower17.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 命令。

相關內容